class
C {
C() {
System.out.print(
"C"
);
}
}
class
A {
C c =
new
C();
A() {
this
(
"A"
);
System.out.print(
"A"
);
}
A(String s) {
System.out.print(s);
}
}
class
Test
extends
A {
Test() {
super
(
"B"
);
System.out.print(
"B"
);
}
public
static
void
main(String[] args) {
new
Test();
}
}
一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾以後,那麼就具有了兩層語義:java
1)保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。緩存
2)禁止進行指令重排序。多線程
volatile只提供了保證訪問該變量時,每次都是從內存中讀取最新值,並不會使用寄存器緩存該值——每次都會從內存中讀取。this
而對該變量的修改,volatile並不提供原子性的保證。spa
因爲及時更新,極可能致使另外一線程訪問最新變量值,沒法跳出循環的狀況線程
多線程下計數器必須使用鎖保護。code