1、可见性
1)是什么
可见性是一个线程修改了共享变量,另一个线程能立马看到
2)为什么会出现
①操作系统
在操作系统中,每个cpu都是从自己的缓存中读取数据,缓存中的数据是从主内存中获取的。
可能在某一时刻,其中一个cpu更改了自己的缓存数据,将数据更新主存中,而另一个cpu读取数据时,只是读取自己的缓存,缓存数据跟主内存数据不一致。
总结:针对多核cpu,每个cpu只读取自己的缓存数据导致了可见性。
对于单cpu而言,是不存在可见性问题的。
②java的可见性
在java中,所有数据存在放到主内存中,每个线程只读取自己的工作内存(此时的工作内存,相当于cpu的缓存),各个工作内存的数据不能被相互访问,读写时,每个线程只操作自己的工作内存中的数据。
2、原子性
1)是什么
原子性是指一个或多个操作不能被cpu中断,这些操作是一起执行完毕的
2)出现原因
由于cpu会给每一个操作分配时间差不多的时间片,对于每个操作,等自己的时间片的时间到了,就停止执行,需要等这个操作再次拿到cpu时间片后才继续执行。
3)经典案例
i++,包含了3个步骤
(1)先从主内存中获取到i
(2)对i做自加1
(3)将修改后的i写回到主内存中
如果线程a执行到了2,线程b从主内存拿到的i就不是想要的值了
3、有序性
1)是什么
有序性是程序按照代码的既定顺序执行
2)出现的原因
编辑器或解释器为了优化程序的执行性能,更改了执行顺序
3)经典案例
使用双重检查机制来创建单例对象