Java高并发同步Volatile的使用

Posted TopCoderのZeze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java高并发同步Volatile的使用相关的知识,希望对你有一定的参考价值。

引言:     

    在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。

    可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

Volatile的官方定义

    Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。

为什么要使用Volatile?

    Volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。

Volatile的使用优化

  著名的Java并发编程大师Doug lea在JDK7的并发包里新增一个队列集合类LinkedTransferQueue,他在使用Volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。

  追加字节能优化性能?这种方式看起来很神奇,但如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类,它使用一个内部类类型来定义队列的头队列(Head)和尾节点(tail),而这个内部类PaddedAtomicReference相对于父类AtomicReference只做了一件事情,就将共享变量追加到64字节。我们可以来计算下,一个对象的引用占4个字节,它追加了15个变量共占60个字节,再加上父类的Value变量,一共64个字节。

以上是关于Java高并发同步Volatile的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java——多线程高并发系列之volatile关键字

Java——多线程高并发系列之volatile关键字

java多线程高并发学习从零开始——初识volatile关键字

java并发常识

Java高并发学习笔记:volatile关键字

《重学Java高并发》同步转异步编程技巧与实战运用