1 CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内...
原子性,对volatile变量的读写具有原子性,即单纯读和写的操作,都不会受到干扰。这里有误
public class VolatileTest {
private static volatile int INIT_VALUE = 0;
private final static int MAX_LIMIT = 500;
public static void main(String[] args) {
new Thread(() -> {
while (INIT_VALUE < MAX_LIMIT) {
System.out.println("T1->" + (++INIT_VALUE));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "ADDER-1").start();
new Thread(() -> {
while (INIT_VALUE < MAX_LIMIT) {
System.out.println("T2->" + (++INIT_VALUE));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "ADDER-2").start();
}
}
部分打印结果:
T1->19
T2->20
T1->21
T1->22
T2->23
T1->24
T2->25
T1->26
T2->26
T1->27
T2->27
T2->28
T1->28
T1->29
T2->30
T1->32
++INIT_VALUE 操作分三步:
a.读取变量 INIT_VALUE的值 -> 26
INIT_VALUE 的值+1 -> 26+1
将值赋予变量 INIT_VALUE -> INIT_VALUE=27
由于这三步中的任意一步线程都可能放弃cpu执行权,其他线程获取到执行权后如果一步完成,就会出现上图的情况
深入理解JVM-内存模型(jmm)和GC1 CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内...