一、并发和并行
并发是在一段时间内交替执行多个任务。并行则是在同一时间内同时执行多个任务。并行是特殊的并发。多线程编程的任务是把串行计算改为并发甚至并行计算。
二、线程安全问题
线程安全问题主要要保障3个方面:原子性,可见性,有序性。
1.原子性:对一个共享变量的读写操作,在其他线程看来要么未操作,要么全部完成,而不会看到中间结果。
实现原子性:a.锁 b.CAS指令
tips:除long/double外,其他类型的写操作都是原子性的,可通过volatitle long/double保障原子性,读操作都是原子性的,原子操作+原子操作不一定是原子操作。
2.可见性:一个线程对共享变量的更新对于其他线程是可见的。
相对新值:一个线程对共享变量的更新后,其他线程能够读取更新后的值,这个值称为相对新值。
最新值:在一个线程读取这个共享变量的过程中,其他线程无法更新该变量的值,那么这个相对新值为最新值。
可见性只能保障得到相对新值。
3.有序性:一个处理器上运行的一个线程对共享变量所做的更新,在其他处理器运行的线程看来,这些线程是以什么顺序观察这些更新的。
三、上下文切换
从java应用看,一个线程在RUNNABLE和非RUNNABLE下转换会导致上下文切换。
四、线程的活性故障
1.死锁:两个或者更多线程因相互等待对方而永远被暂停
死锁产生的条件:资源互斥、资源不可被抢夺、占有并等待、 循环等待资源
2.锁死:等待线程一直无法被唤醒
3.活锁:线程一直在做无用功导致其任务一直无法进展
4.饥饿:线程一直无法获得其所需的资源导致其任务一直无法进展
五、资源的争用与调度
同时访问一个已被占有的资源的线程越多,争用程度越高。
同一时间,处于运行状态(即RUNNABLE的RUNNING状态)的线程数越多,并发程度越高。
我们的目标是要达到低争用,高并发。
六、java虚拟机对内部锁的优化
1.锁消除:能彻底消除锁的开销
2.锁粗化:能减少线程申请、释放锁的频率
3.偏向锁:能减小线程申请、释放锁的开销
4.适应性锁::能减小线程申请锁的开销
注意:上述优化仅在java虚拟机server模式下起作用。
七、java内存模型
java内存模型规定了一个线程如何和何时可以看到其他线程修改的共享变量的值以及在需要时如何同步地访问共享变量。
![](https://img.haomeiwen.com/i12204631/6e32603605c84bb0.png)
网友评论