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){}代码块时呈同步效果

posted on 2017-07-28 13:53  摩羯的小石头  阅读(66)  评论(0编辑  收藏  举报