java并发:线程同步机制之Volatile关键字&原子操做Atomic

volatile关键字html

  volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchronized同步块中变量的可见性,而volatile则是保证了所修饰变量的可见性。可见性指的是在一个线程中修改变量的值之后,在其余线程中可以看到这个值(在Java并发程序缺乏同步类的状况下,多线程对成员变量的操做对其它线程是透明的(不可见))。由于volatile只是保证了同一个变量在多线程中的可见性,因此它更可能是用于修饰做为开关状态的变量。java

  java关键字volatile,从表面意思上是说这个变量是易变的,不稳定的,事实上,确实如此,这个关键字的做用就是告诉编译器,凡是被该关键字声明的变量都是易变的、不稳定的。因此不要试图对该变量使用缓存等优化机制,而应当每次都从它的内存地址中去读值。使用volatile标记的变量在读取或写入时不须要使用锁,这将减小产生死锁的几率,使代码保持简洁。缓存

  请注意,这里只是说每次读取volatile的变量时都要从它的内存地址中读取,并无说每次修改完volatile的变量后都要马上将它的值写回内存。也就是说volatile只提供了内存可见性,而没有提供原子性,操做互斥提供了操做总体的原子性,同一个变量多个线程间的可见性与多个线程中操做互斥是两件事情,因此说若是用这个关键字作高并发的安全机制的话是不可靠的。安全

volatile的用法以下:多线程

public volatile static int count=0;//在声明的时候带上volatile关键字便可

  何时使用volatile关键字?当咱们知道了volatile的做用,咱们也就知道了它应该用在哪些地方,很显然,最好是那种只有一个线程修改变量,多个线程读取变量的地方。也就是对内存可见性要求高,而对原子性要求低的地方。并发

从上面的描述中,咱们能够看出volatile与加锁机制的主要区别是:加锁机制既能够确保可见性又能够确保原子性,而volatile变量只有确保可见性。高并发

 

原子操做Atomic

  Volatile变量能够确保先行关系,保证下一个读取操做会在前一个写操做以后发生(即写操做会发生在后续的读操做以前),但它并不能保证原子性。例如用volatile修饰count变量,那么count++ 操做就不是原子性的。优化

 

AtomicInteger是基于sun.misc.Unsafe来实现的,其定义以下:atom

 

该类中有以下一系列方法:spa

其中某些方法的实现以下:

 

此处再介绍一下AtomicReference,其定义以下:

该类使用了泛型,在定义该类型的变量时须要指定泛型实参,以下:

public final static AtomicReference <String> ATOMIC_REFERENCE = new AtomicReference<String>("abc");

其中String即泛型实参

 

参考资料:

本文从概念上简单描述了java并发中volatile关键字及原子操做atomic的部份内容,此处贴出一些优质文章以供读者阅览

(1)http://www.importnew.com/18126.html

(2)http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

(3)http://www.importnew.com/20594.html

相关文章
相关标签/搜索