所有static修饰的变量,类的所有实例对象对于该值公用一份,即只有一份内存地址。但是线程加载static变量时,也会有对应的线程内部的缓存。此时就有必要增加volatile,强迫线程从内存地址上重新获取变量取值,而非从线程缓存取值。当然 static+volatile也是不能代替同步的,因为不一定符合原子性。
具体可参见:
https://stackoverflow.com/questions/2423622/volatile-vs-static-in-java?answertab=active#tab-top