1.valatile保证可见性
2.写屏障
写屏障保证写完前后的数据都刷新到了主存,这样主存中去读取的数据都是最新的数据(不会存在脏数据)。
3.读屏障
读屏障保证读取之前的数据是最新的数据。
4.valitale无法保证原子性
修改数据分为3步:
1.读取count
2.count++
3.回写count
因为有可能线程1拿到count阻塞,线程2就算拿到最新的数据,但是线程1进行count++,线程2也会进行count++,无法保证原子性。
5.volatile的使用
volatile适合保证用于标识某个操作是否结束。因为判断之前读取的数据都是最新的。
6.有序性:happens-before原则
1.程序次序规则:一个线程内,按照代码的顺序,书写在前面的操作先行发生于后面操作。(单线程有效,指代码执行顺序,不代表不代表不可以指令重排)
2.锁规则:一个unLock操作先行发生于后面对于同一个锁lock的操作。
3.volatile变量规则:面对这个变量的写操作先行发生于这个变量的读操作。
4.传递规则:如果操作A发生先于操作B,操作B发生先于操作C,那么操作A先于操作C。
5.线程启动规则:Thread的start()操作优先于此线程的其他所有的操作
6.线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。
7.线程终止原则:线程中的中所有操作都先行发生于现成的终止操作,我们可以通过thread.jion()和thread.isAlive()的返回值来检测代码执行结束
8.对象终结原则:一个对象的初始化先行发生于它的finalize()的开始