`

[转]java.util.concurrent.atomic随笔及volatile语义

阅读更多

 

转自:http://ruijunsuo.blog.163.com/blog/static/400596322012122127820/

 

一个原子操作(atomic operation)是个不能分割的整体,没有其它线程(thread)能够中断或检查正在原子操作中的变量。一个原子(atomic)类型就是一个原子操作可用的类型,它可以在基本上没有锁(lock)的情况下做到线程安全(thread-safe)。

java.util.concurrent.atomic包就是提供原子操作的类的小工具包,支持在单个变量上解除锁定的线程安全编程。包中的类将volatile值、字段和数组元素的概念扩展到那写也支持原子条件更新操作的类。如AtomicReference,一个“可以用原子方式更新的对象引用”。

JDK的文档中说:“设计原子类主要用作各种块,用于实现非阻塞数据结构和相关基础结构类compareAndSet()方法不是锁定的常规替换方法。仅当对象的重要更新限于单个变量时才应用它”

 

volatile语义

volatile相当于synchronized的弱实现,也就是说volatile实现了类似synchronized的语义,却又没有锁机制。它确保对volatile字段的更新以可预见的方式告知其他的线程。

volatile包含以下语义:

(1)Java 存储模型不会对valatile指令的操作进行重排序:这个保证对volatile变量的操作时按照指令的出现顺序执行的。

(2)volatile 变量不会被缓存在寄存器中(只有拥有线程可见)或者其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。也就是说对于 volatile变量的修改,其它线程总是可见的,并且不是使用自己线程栈内部的变量。也就是在happens-before法则中,对一个 valatile变量的写操作后,其后的任何读操作理解可见此写操作的结果。

尽管volatile变量的特性不错,但是volatile并不能保证线程安全的,也就是说volatile字段的操作不是原子性的,volatile变量只能保证可见性(一个线程修改后其它线程能够理解看到此变化后的结果),要想保证原子性,目前为止只能加锁!

 

应用volatile变量的三个原则:

 

(1)写入变量不依赖此变量的值,或者只有一个线程修改此变量

(2)变量的状态不需要与其它变量共同参与不变约束

(3)访问变量不需要加锁

 

 

分享到:
评论

相关推荐

    java.util.concurrent 学习ppt

    Java.util.concurrent的引入是为了解决传统并发原语如wait()、notify()、synchronized和volatile的使用难度大、容易出错以及性能问题。 在并发编程中,我们经常会遇到需要管理多个线程执行任务的情况。传统的做法是...

    工作在同一个java虚拟机中的线程能实现消息互发(alpha)

    5. **原子变量(Atomic Variables)**:`java.util.concurrent.atomic`包提供了原子操作类,如`AtomicInteger`、`AtomicLong`等,它们在多线程环境下提供了无锁的数据更新机制。 6. **管程(Java 5后引入的`java....

    Java多线程 - (一) 最简单的线程安全问题

    import java.util.concurrent.atomic.AtomicInteger; public class Counter { private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); } } ``` 5. **...

    Addison.Wesley.Java.Concurrency.in.Practice.May.2006.pdf

    7. **原子操作与无锁编程**:介绍了java.util.concurrent.atomic包下的原子类,如AtomicInteger、AtomicReference等,以及无锁编程的概念和实现,它们提供了高效且避免锁竞争的并发解决方案。 8. **并发工具**:...

    JDK concurrent

    这些示例通常会涵盖各种并发控制机制,如`synchronized`, `volatile`, `java.util.concurrent.atomic`包下的原子变量类,以及`java.util.concurrent.locks`包中的锁接口和类。 综上所述,JDK concurrent是一个涵盖...

    java并发编程分享

    `java.util.concurrent.atomic`包提供了原子变量类,如AtomicInteger和AtomicReference,它们通过CAS(Compare and Swap)无锁算法实现线程安全的更新操作。 10. **中断和异常处理** Thread类的interrupt()方法...

    Java内存模型

    这通常通过同步块(synchronized)、 volatile关键字或者原子操作(java.util.concurrent.atomic包)来实现。 JMM通过以下方式体现有序性(Ordering): 1. Java提供了同步机制(例如synchronized)和volatile...

    java线程安全总结.pdf

    - `java.util.concurrent.atomic` 包:提供了原子操作的变量类,如`AtomicInteger`、`AtomicLong`,它们提供了无锁的原子更新操作,适用于高性能并发场景。 6. ** volatile 与 synchronized 的区别** - `volatile...

    Java并发编程学习笔记.

    10. **原子类**:`java.util.concurrent.atomic`包下的原子类如`AtomicInteger`、`AtomicLong`等,提供了基于CAS(Compare and Swap)的无锁操作,用于在多线程环境下实现高效且线程安全的操作。 11. **Future和...

    初见volatile.md,学习代码

    最后,了解并发编程不仅需要掌握`volatile`、`ThreadLocal`等基础概念,还需要理解Java内存模型、锁机制(如`synchronized`关键字)、原子类(如`java.util.concurrent.atomic`包中的类)以及时间控制(如`TimeUnit`...

    Java线程同步与 Java 并发设施.pdf

    在Java中,线程同步可以通过多种方式实现,如synchronized关键字、java.util.concurrent.locks.Lock接口以及java.util.concurrent.atomic包中的原子操作类。 synchronized关键字是Java中的一种内置同步机制,它可以...

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    ReentrantLock是Java.util.concurrent包中的锁,它提供了与`synchronized`相似的功能,但更灵活。ReentrantLock的实现基于AbstractQueuedSynchronized(AQS)同步器,采用非阻塞的FIFO(先进先出)等待队列。当线程...

    Concurrent_Programming+Java Concurrency in Practice+langspec

    尽管这本书较早,但其讨论的基本原理和很多技术仍然适用于现代Java开发,如`synchronized`关键字、wait/notify机制以及 Doug Lea 自己设计的`java.util.concurrent.atomic`包中的原子类。 在Java并发编程中,理解...

    Java并发编程:设计原则与模式(Concurrent.Programming.in.Java)(中英版)

    例如,使用无锁数据结构或原子操作(`java.util.concurrent.atomic`包)。 3. **避免死锁、活锁和饥饿**:理解并预防这些并发问题至关重要。死锁发生在两个或多个线程相互等待对方释放资源导致僵局;活锁是线程不断...

    高清Java高并发程序设计

    2. **同步机制**:Java提供多种同步机制,包括`synchronized`关键字、`volatile`变量、`java.util.concurrent`包下的锁(如`ReentrantLock`)、`Semaphore`信号量等,用于解决并发环境中的数据竞争问题。 3. **并发...

    Java 并发编程实战pdf + 随书源码 (书高清版,带超详细书签目录)

    2. **并发控制**:Java提供了一系列的并发控制工具,如`synchronized`关键字用于互斥访问,`volatile`关键字确保变量可见性,`java.util.concurrent`包下的`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)和`...

    Java.9.Concurrency.Cookbook.2nd.Edition

    2. **并发工具类**:详细讲解了`java.util.concurrent`包中的各种并发工具,如`ExecutorService`、`Semaphore`、`CountDownLatch`、`CyclicBarrier`和`Future`等,以及它们在实际编程中的应用。 3. **原子变量与...

    java并发编程实践.zip

    6. **原子变量与并发原语**:`java.util.concurrent.atomic`包中的原子变量类,如`AtomicInteger`、`AtomicLong`等,以及`volatile`关键字,都是并发编程中的重要原语,用于实现无锁编程。 7. **并发设计模式**:书...

Global site tag (gtag.js) - Google Analytics