volatile和synchronized关键字
volatile:
在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生。
如果不加volatile关键词,线程只会读取线程内部的变量副本。而线程外部更新线程内的变量,只会更新主内存中的变量。
但是对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的,但是在线程中处理(load,use,asign,store)时,主内存的值可能已经更新了,所以不能保证线程中的副本变量是最新的。
synchronized:
synchronized修饰的代码块和方法,同一时间只允许一个线程调用。
同一个类中的两个synchronized方法一起执行,也是同步的。
当一个线程中执行了synchronized(x){}同步代码块时:
1.当多个线程同时执行synchronized(x){}同步块代码时呈同步效果
2.当其他线程执行x对象中的synchronized同步方法时呈同步效果
3.当其他线程执行x对象中的synchronized(this){}代码块时呈同步效果