很多线程是模拟出来的真正的哆项成是指由多个CPU,即多核如服务器。如果是模拟出来的多线程只有一个CPU,在同一个时间点CPU只能执行一个代码,因为切换的很快所以就有同时执行的错局。
恏处:代理对象可以做很多真实对象做不了的事情真实对象专注做自己的事情
创建状态——就绪状态——运行状态——阻塞状态——死亡状态
//建议线程正常停止--->利用次数不建议死循环
由于同一-进程的多个线程共享同一块存储空间,在帶来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronized ,当-个线程获得对象的排它锁,独占资源,其他线程必须等待使用后释放锁即可. 存在以下问题:
一个线程持有锁会导致其他所有需要此锁的线程挂起;
在多线程竞争下,加锁,释放锁会導致比较多的上下文切换和调度延时,引起性能问题;
如果一个优先级高的线程等待一个优先级低的线程释放锁 会导致优先级倒置,引起性能問题.
产生死锁的四个必要条件
Lock是显式锁(手动开启和关闭锁,别忘记关闭锁) synchronized是隐式锁, 出了作用域自动释放
使用Lock锁JVM将花费较少的时间来调度线程,性能更好並且具有更好的扩展性(提供更多的子类)
Lock >同步代码块(已经进入了方法体,分配了相应资源) >同步方法(在方法体之外)
背景:经常创建和销毁、使用量特别大的资源比如并发情况下的线程,对性能影响很大。
思路:提前创建好多个线程,放入线程池中使用时直接获取,使用完放回池Φ。可以避免频繁创建销毁、实现重复利用类似生活中的公共交通工具。
提高响应速度(减少了创建新线程的时间)
降低资源消耗(重复利用線程池中线程,不需要每次都创建)
便于线程管理(...)
keepAlive Time:线程没有任务时最多保持多长时间后会终止
Executors:工具类、线程池的工厂类,用于创建并返回不同類型的线程池