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

volatile 和 synchronized

阅读更多
区分volatile和 synchrozied的使用场景,首先需要了解多线程环境下,线程的工作方式

(转载)

在多线程环境下,每个线程都保留一个线程上下文,存储了主存中共享变量的副本,因此会带来两个问题:1、可见性  2、原子性

可见性:
多线程环境下,如果后一个线程访问到的变量值是前一个线程修改后的变量值,说明这个变量是可见的,否则就是非可见的。

原子性:
变量的访问是原子的,即同一时刻只能有一个线程对其访问。

解决多线程环境下的可见性和原子性,就要用到volatile和 synchrozied;

一、volatile
所谓volatile,就是告诉处理器,每次变量的访问都直接在主存中操作;
多线程编程时,使用volatile的好处是:更高的吞吐量、更少的代码;
使用volatile可以解决多线程下变量的可见性问题,但是volatile很容易被误用,用来进行原子性操作。
较为常见的case为多线程下计数器的实现
   public volatile int i;
   i++;

因为i++是一个复合操作,即i=i+1;(先读主内存,后修改,然后刷新主内存)
所以多线程下,有可能在在刷新主内存前已经有另外一个线程读取了旧值。

二、synchronized
线程同步关键字,通过对变量或者语句块使用,可以保证操作的原子性。
  • 大小: 57.8 KB
分享到:
评论

相关推荐

    volatile和synchronized的区别

    在Java中,为了保证多线程环境下数据的一致性和安全性,可以采用两种主要的方法:`synchronized`和`volatile`。 ##### 1. synchronized关键字 `synchronized`是一种基于锁的同步机制,它可以应用于方法或者代码块...

    java中volatile和synchronized的区别与联系

    Java 中 volatile 和 synchronized 的区别与联系 Java 中的 volatile 和 synchronized 是两种不同的关键字,它们都是用来解决多线程编程中出现的问题,但是它们的作用机制和使用场景却不同。 volatile volatile ...

    Java关键字volatile和synchronized作用和区别

    Java关键字volatile和synchronized作用和区别 Java关键字volatile和synchronized是Java语言中两个常用的关键字,它们都是用来解决多线程编程中的同步问题的,但它们的作用和用法却有所不同。 volatile关键字是变量...

    volatile与synchronized的区别

    volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)

    java多线程中的volatile和synchronized用法分析

    在Java多线程编程中,volatile和synchronized是两种重要的同步机制,用于处理并发环境下的数据一致性问题。这里我们将深入探讨这两个关键字的用法、作用以及它们之间的区别。 首先,volatile关键字。volatile确保了...

    java里的volatile关键字详解

    3. 有序性:Java语言提供了volatile 和synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized是由“一个变量在同一个时刻只允许一条线程对其进行...

    java内存模型.zip

    8. volatile 和 synchronized 的区别:volatile 更轻量级,不会引起线程上下文的切换和调度,而 synchronized 会。volatile 只能保证单个变量的原子性和可见性,而 synchronized 可以保证整个代码块的原子性。 9. ...

    2023年Java面试题+详细总结.docx

    Java 面试题总结 ...Volatile 和 Synchronized 是 Java 中的两种同步机制。Volatile 是一种轻量级的同步机制,用于实现线程间的数据共享。Synchronized 是一种重量级的同步机制,用于实现线程间的数据共享和同步。

    JAVA内存模型.docx

    JMM规定了线程如何看到其他线程对共享变量的修改,并规定了必要的同步策略,如volatile关键字和synchronized块,以保证内存可见性和有序性。 2. JMM抽象地描述了程序运行时的数据流向,包括工作内存(包含CPU缓存和...

    深入理解Java内存模型(二)共3页.pdf.zip

    Java内存模型通过synchronized和volatile以及CAS(Compare and Swap)操作来保证原子性。 5. 有序性:在单线程环境中,程序的执行顺序与代码的书写顺序一致。但在多线程环境中,为了优化性能,JVM可能会重新排序...

    Java并发机制的底层实现原理.pdf

    Java通过synchronized和volatile关键字提供了一套高级并发控制机制,而处理器通过原子指令来保证基本的并发操作。比如x86架构的lock前缀指令,可以保证在执行操作时其他处理器不能访问对应的内存地址,从而实现原子...

    【多线程与高并发原理篇:3_java内存模型】.doc

    Java 内存模型(JMM)是Java编程中用于处理多线程环境下数据一致性问题的重要概念...开发者需要理解并利用好JMM提供的机制,如volatile和synchronized,来解决多线程环境中的并发问题,以编写出高效且可靠的并发程序。

    Java多线程中提到的原子性和可见性、有序性1

    Java提供了volatile和synchronized来保证线程间的有序性。volatile关键字禁止指令重排序,而synchronized保证了同一时间只有一个线程能执行特定的代码块,从而确保了执行的顺序。 此外,Java内存模型中有一个“先行...

    并发编程讲解底层原理详细讲解.docx

    它规定了volatile变量、synchronized块和final字段的语义,以确保内存可见性和线程间的同步。 volatile关键字是Java中用于线程间通信的关键特性。它保证了变量的可见性,即当一个线程修改了volatile变量后,其他...

    java内存模型深入了解

    9. ** volatile和synchronized的区别**:volatile仅保证可见性和有序性,不保证原子性;而synchronized则提供锁机制,保证了原子性、可见性和有序性。 深入理解Java内存模型,可以帮助开发者避免并发编程中出现的...

    JSR133中文版1.rar_java

    8. **编程实践**:JSR133提供了一些最佳实践,如避免使用不安全的并发工具,正确使用volatile和synchronized等,帮助开发者编写出高效且线程安全的代码。 "JSR133中文版1.pdf"文件很可能是这份规范的完整中文翻译,...

    Java多线程编程的线程安全性.docx

    Java提供了多种并发工具和机制,如synchronized、volatile、java.util.concurrent包下的各种并发容器,以及ReentrantLock、Semaphore等,帮助开发者实现线程安全的代码。在编写多线程代码时,应该根据具体需求选择...

    并发编程之JMM&synchronized&volatile详解.pdf

    例如,合理使用volatile关键字可以减少不必要的缓存刷新,而明智地运用synchronized可以防止数据不一致,提高程序的正确性和可靠性。因此,深入学习并发编程的关键概念以及它们在现代计算机硬件上的实现,是成为高效...

    并发编程一之synchronized和volatile.rar

    本资源"并发编程一之synchronized和volatile.rar"提供了多个示例代码(demo1到demo12),帮助我们深入理解这两个关键字的功能与用法。 1. **synchronized关键字**: - **互斥性**:synchronized可以确保同一时间...

Global site tag (gtag.js) - Google Analytics