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