`

volatile和原子操作

 
阅读更多

volatile 可以保证变量的原子性和可视性。。 但不能保证原子操作,如++,-- 等均不是原子操作。 如需操作请使用synchronized关键字 或 Lock锁。

 

原子操作为,变量的取值和赋值。

 

volatile 保证的是long和double的原子性,因为这两个变量为64位,在JVM 中处理时看做32位,所以在并发时变量需要加上volatile修饰,保证在赋值等处理时,不会发生数据断开的情况。

 

当并发的共享变量需要返回,或者在多处引用时,需要注意该共享变量的可视性,保证取得的是内存中的最新值, 加入volatile修饰即可。

 

http://xiabin1235910-qq-com.iteye.com/admin/blogs/1571669 详细讲解了 volatile的使用及注意事项。非常有用,详细了解。

 

在windows核心编程一书中,用户模式下的线程同步这一章,206页  也提到volatile的使用。

保证变量每一次都从内存中取得最新值,而不是在编译器优化后,重复取得cpu寄存器的值。

 

详见 java编程思想并发一章的原子性与可视性。

分享到:
评论

相关推荐

    原子操作与volatile

    1高手成长的六个阶段一第一阶段此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。到达这个阶段后可以真正地在实践中做些应用。第五阶段此阶段就已经不再局限于简单的技术上的问题了

    Java中的原子操作:深入探索AtomicInteger的实现与应用

    它通过 Unsafe 类提供的硬件级别的原子操作和 volatile 关键字保证了操作的原子性和可见性。在实际开发中,我们应该根据具体的应用场景选择合适的同步机制。对于简单的原子操作,AtomicInteger 是一个很好的选择。而...

    atomic_ops原子操作1

    atomic_ops 的行为可以分为两类:原子操作和 bitmask 操作。原子操作包括 atomic_set、atomic_read、atomic_dec 等,bitmask 操作包括 set_bit、clear_bit、test_bit 等。 volatile 的重要性 在 atomic_ops 中,...

    volatile,nonatomic和atomic关键字测试

    然而,`volatile`并不保证操作的原子性,所以它不能单独解决并发问题。 接着,`nonatomic`和`atomic`与Objective-C的属性有关,它们定义了属性赋值和取值操作的线程安全性。默认情况下,Objective-C的属性是`atomic...

    java里的volatile关键字详解

    (a 非long 和double类型)这个操作是不可分割的,那么我们说这个操作时原子操作。 3. 有序性:Java语言提供了volatile 和synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重...

    Java线程:volatile关键字

    Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized ...

    stm32 volatile变量的正确使用

    - 即使使用了`volatile`,也不能保证数据的原子性。在多线程或多任务环境中,还需要结合互斥锁等机制来保证数据访问的一致性和安全性。 #### 结论 在嵌入式系统编程中,正确使用`volatile`关键字对于避免潜在的bug...

    volatile用法

    `volatile`不保证操作的原子性,而`synchronized`可以。 总的来说,`volatile`关键字在嵌入式系统编程和多线程编程中扮演着关键角色,帮助开发者处理内存一致性问题,确保程序的正确运行。理解和正确使用`volatile`...

    volatile 变量的说明

    例如,如果你有一个计数器并尝试通过多个线程同时递增,volatile并不能保证递增操作的原子性,因此仍然需要使用synchronized或者其他并发控制机制来保证。 下面是一些关于volatile的常见问题及其解答: 1. **参数...

    Java并发编程:volatile关键字解析

    - **非原子性**:需要注意的是,虽然`volatile`关键字提供了可见性和有序性保证,但它并不能保证复合操作的原子性。例如,对于`i++`这样的操作,即使`i`是`volatile`变量,该操作也不是原子性的。 #### 五、使用...

    Java并发编程系列- volatile

    例如,以下代码中的变量自加操作就不是一个原子操作: ```java class Counter { volatile int count = 0; public void increment() { count++; } } ``` 在多线程环境下,多个线程同时调用`increment()`方法时...

    Linux内核同步机制

    信号量的实现是基于原子操作的,通过原子操作来实现锁的获取和释放。 四、死锁 死锁是指在多个进程或线程之间,因为互相等待对方释放资源而导致的僵局。假设有一个或多个内核任务和一个或多个资源,每个内核都在...

    volatile和synchronized的区别

    3. **原子性**:`volatile`不能保证复合操作的原子性,而`synchronized`可以保证原子性。 4. **编译器优化**:`volatile`标记的变量不会被编译器优化,以保证其可见性,而`synchronized`标记的变量可能会被编译器...

    volatile的使用1

    volatile确保了变量在多线程环境下的可见性和有序性,但它并不保证原子性。 1. **可见性**:当一个线程修改了volatile变量的值,其他线程可以立即看到这个改变。这是因为volatile变量的修改会直接写回主内存,其他...

    Volatile的正确使用1

    总结起来,`volatile`是Java中一种轻量级的同步机制,适用于简单的线程间通信,尤其是当不需要原子操作且满足上述两个条件时。但在复杂的并发场景中,如涉及到变量的复合操作或依赖于当前值的写操作,应使用`...

    java 并发操作之原子性与可视性1

    然而,由于`a++`本身不是原子操作,即使`a`是`volatile`的,仍然需要额外的同步措施来确保线程安全。 总结来说,原子性和可见性是Java并发编程中两个独立但又相互关联的概念。原子性关注的是操作是否不可分割,而...

    volatile关键字使用

    `volatile`关键字是C++和Java等编程语言中用于处理多线程环境或者与硬件交互时的一个关键特性。它主要用于修饰变量,表明该变量的值可能会在编译器不知情的情况下发生变化,例如由其他线程修改、外部硬件事件影响...

    从volatile说到i++的线程安全问题.docx

    在实际应用中,需要根据具体情况选择合适的解决方案,例如使用锁机制、原子操作或volatile关键字。 五、相关概念 * 多线程环境 * 共享变量 * 可见性 * 原子性 * 锁机制 * volatile关键字 * i++操作 六、参考文献 ...

    volatile变量

    不过,需要注意的是`volatile`只能保证可见性和禁止指令重排,并不能保证原子性。 #### 五、总结 `volatile`是一个重要的关键字,特别是在处理可能被意外修改的变量时。它帮助程序员编写出更可靠、更安全的代码。...

Global site tag (gtag.js) - Google Analytics