并发:分工,协作,互斥
协助:线程间同步,当某个条件不满足时,线程需要等待,等条件满足时,线程需要被唤醒(管程)
互斥:同一时间只能有一个线程持有竞争的资源 (互斥锁 无锁)
线程不安全的原因:可见性,有序性,原子性
可见性:一个线程对内存变量的修改,其它线程是否可以立即看到。当多个线程位于不同的cpu,各个线程操作cpu缓存的变量,不立即刷新到内存中,存在可见性问题。
原子性:一个或多个操作在cpu执行的过程中不被中断。cpu能够保证的原子性操作是cpu指令级别。
可见性问题:cpu缓存的存在。
volatile禁用缓存 ,读写都和内存交互
happens-before:前面一个操作的结果对后续操作是可见的。
1- 代码顺序
2- volatile变量规则
3- 传递性 a>b b>c 则 a>c
4- 管程中的锁 synchronized
5- 线程start规则
6- 线程join规则
有序性的问题:编译器优化