icon-cookie
The website uses cookies to optimize your user experience. Using this website grants us the permission to collect certain information essential to the provision of our services to you, but you may change the cookie settings within your browser any time you wish. Learn more
I agree
Summary | 12 Annotations
缓存一致性问题
2017/08/02 03:05
通常称这种被多个线程访问的变量为共享变量
2017/08/02 03:06
虽然处理器会对指令进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同
2017/08/02 03:12
指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性
2017/08/02 03:13
也就是说,要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。
2017/08/02 03:15
Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。
2017/08/02 03:20
Java提供了volatile关键字来保证可见性
2017/08/02 03:20
可以通过volatile关键字来保证一定的“有序性”(具体原理在下一节讲述)。另外可以通过synchronized和Lock来保证有序性
2017/08/02 03:20
通过synchronized和Lock也能够保证可见性
2017/08/02 03:46
happens-before原则
2017/08/02 03:47
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:   1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。   2)禁止进行指令重排序。
2017/08/02 03:50
 volatile关键字禁止指令重排序有两层意思:   1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;   2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行
2017/08/02 04:00