
1 CPU和內(nèi)存的交互 了解jvm內(nèi)存模型前船老,了解下cpu和計算機內(nèi)存的交互情況咖熟。【因為Java虛擬機內(nèi)存模型定義的訪問操作與計算機十分相似】 有篇很棒的文章柳畔,從cpu講到內(nèi)...
原子性馍管,對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();
}
}
部分打印結(jié)果:
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執(zhí)行權(quán),其他線程獲取到執(zhí)行權(quán)后如果一步完成,就會出現(xiàn)上圖的情況
深入理解JVM-內(nèi)存模型(jmm)和GC1 CPU和內(nèi)存的交互 了解jvm內(nèi)存模型前,了解下cpu和計算機內(nèi)存的交互情況俘陷÷奚樱【因為Java虛擬機內(nèi)存模型定義的訪問操作與計算機十分相似】 有篇很棒的文章,從cpu講到內(nèi)...