`
zwt2001267
  • 浏览: 446944 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java的原子操作和volatile

阅读更多

原子操作
所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作 在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。

关于java中的原子性
原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。对于读取和写入出long和double之外的基本类型变量这样的操作 ,可以保证它们会被当作不可分(原子)的操作来操作。

volatile
当我们定义一个变量,假设就叫o吧,理论上讲,每次使用到o的时候,都应该从o的地址来读取这个变量,但是这存在一个效率问题,就是每次 使用o的时候都要从内存中去取值,然后通过系统总线传到CPU处理,这样开销会很大。所以编译器为了优化性能,把o放进CPU的Cache中,假如 o在赋值期间没有被改变,就直接从CPU的Cache里取o的副本来进行赋值。但是"bug"也显而易见,可能o已经被一个线程改变而重新写回了内存 ,但另一个线程并不知道,依旧按照原来的计划从CPU的Cache里读o的副本来取值,结果不幸发生了。 于是编译器的开发者为了补救这一"bug",提供了一个volatile让开发人员为他们的过失埋单,或者说提供给开发人员了一个选择效率的权利。 当变量加上了volatile时,编译器就老老实实的每次都从内存中读取这个变量值,否则就还按照优化的方案从cache里读。

在两个或者更多的线程访问的成员变量上使用volatile较好,当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuhe688/archive/2009/12/02/4924702.aspx

分享到:
评论

相关推荐

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

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

    violate java-Java 之 volatile 超级详解

    在Java中,当一个变量被声明为`volatile`时,编译器会确保对该变量的所有读写操作都是原子性的,并且确保所有线程看到的该变量的值是最新的。这意味着,如果一个线程修改了`volatile`变量,其他线程无需额外的同步...

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

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

    java里的volatile关键字详解

    1. volatile和synchronized都是Java中的同步机制,用于保证线程之间的可见性、原子性和有序性。 2. volatile只能保证可见性,而synchronized可以保证可见性、原子性和有序性。 3. volatile修饰的变量,不允许线程...

    Java线程:volatile关键字

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

    Java原子操作CAS原理解析

    Java原子操作CAS原理解析 Java原子操作CAS原理解析是Java并发编程中的一种机制,用于解决多线程并行情况下使用锁造成的性能损耗。CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。如果内存位置的...

    Java并发编程系列- volatile

    总的来说,`volatile`关键字在Java并发编程中起到的作用是确保共享变量的即时可见性和防止指令重排,但并不保证操作的原子性。理解并合理使用`volatile`可以有效地提升多线程程序的并发性能,但同时也需要注意它的...

    一文精通Java中的volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...

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

    Java的`concurrent`包提供了原子类,如`AtomicInteger`、`AtomicLong`和`AtomicReference`等,它们通过内在的锁机制或者CAS(Compare and Swap)无锁算法来保证操作的原子性,从而避免了传统同步带来的性能开销。...

    多方面解读Java中的volatile关键字.rar

    在Java编程语言中,`volatile`关键字是一个非常关键的同步原语,用于处理并发编程中的可见性和有序性问题。这个关键字对于理解Java内存模型(JMM)以及如何编写线程安全的代码至关重要。下面我们将从多个角度深入...

    18Java内存模型:Java中的volatile有什么用?1

    总之,`volatile`关键字在Java中起到了保证并发环境下变量可见性和有序性的作用,但并不能保证操作的原子性。在设计多线程程序时,理解`volatile`的工作原理及其限制对于正确地处理并发问题至关重要。

    深入解析Java中的volatile关键字:原理、应用与实践

    在Java并发编程中,volatile关键字是一种轻...然而,由于volatile不提供原子性,因此在进行复合操作时,仍然需要使用其他同步机制。通过理解volatile的工作原理和使用场景,开发者可以编写出更加健壮和高效的并发程序。

    Java并发volatile关键字.docx

    例如,对于volatile变量的自增操作(i++),这个操作包括读取、增加和写回三个步骤,这三个步骤在多线程环境下不是原子的,可能会出现线程安全问题。在上述示例中,`Conter.inc()`方法中的`count++`操作,即使count...

    Java中的关键字volatile详解

    使用volatile关键字不能保证i++操作的原子性。 五、禁止指令重排 moderne JVM对代码的执行顺序有一定的优化。例如: int a = 4; int b = 5; int c = a + b; 上面的代码经过JVM优化后,执行顺序可能不是从上到下...

    java 高并发中volatile的实现原理

    例如,对于一个`volatile`整型变量,如果多个线程同时对其进行自增操作,结果可能不正确,因为自增操作包含读、修改和写三个步骤,这三个步骤不是原子性的。在这种情况下,仍需要使用`synchronized`或者`java.util....

    Java中的`volatile`关键字:原理、应用与实践

    volatile关键字是Java中处理共享...在使用volatile时,需确保其满足线程安全的要求,特别是在需要原子操作的情况下,可能还需要结合其他同步机制。掌握volatile的使用方法,有助于编写出更加高效和安全的多线程代码。

    Java中volatile关键字的总结.docx

    在Java中,基本类型的读取和赋值操作、引用的赋值操作以及`java.concurrent.atomic`包中的原子类操作具有原子性。但像`a++`和`a += 1`这样的复合操作不具备原子性。 2. **可见性** 可见性是指当一个线程修改了...

    Java原子变量类原理及实例解析

    Java原子变量类原理及实例解析 一、原子变量类简介 Java中的原子变量类是为了解决多线程环境下数据的一致性问题而设计的。它可以确保多线程环境下数据的原子性、可见性和有序性。原子变量类的主要特点是它可以在多...

    深入探讨Java多线程中的volatile变量共6页.pd

    例如,如果你有一个计数器,你不能简单地声明为volatile,因为++操作不是原子性的,需要使用synchronized或java.util.concurrent.atomic包下的原子类来确保线程安全。 在实际应用中,volatile常用于简单的状态标记...

Global site tag (gtag.js) - Google Analytics