`
wugc
  • 浏览: 17465 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

Java中的synchronized和volatile

阅读更多
刚开始看Netty,第一个文件Bootstrap,就发现使用了很多volatile关键字。
赶紧补充一下Java线程同步机制的知识。有错误的地方,请大家指正。

说到Java的线程同步问题肯定要说到两个关键字synchronized和volatile。说到这两个关键字,又要说道JVM的内存模型。JVM里内存分为main memory和working memory。

Main memory是所有线程共享的,working memory则是线程的工作内存,它保存有部分main memory变量的拷贝,对这些变量的更新直接发生在working memory里,并在适当的时候写回main memory(很遗憾,我对这个“适当的时候”并不是十分清楚,^_^)。这样如果有多个线程访问同一个变量,就会发生同步问题。

synchronized是常用的同步手段,它可以用来同步程序块,甚至整个函数。但有时候synchronized显得太过粗放。提高多线程程序性能的一个要点就是尽量把同步的粒度最小化,最好做到share nothing, no synchronization。

volatile就是一种粒度更小的同步手段。当然volatile关键字的原始语义并不是用来做同步的。volatile的字面意思是“易变的”,用这个关键字修饰变量就是要告诉JVM,这个变量会被多个线程访问,不要把它放到working memory里,而只有main memory一个拷贝,所有对它的操作都在main memory里进行。由于在32位机器上,对基本类型int, char等的存取操作都在一个指令内完成,也就是说是原子的,这就给线程之间同步共享数据提供了一种力度更小,效率更高的手段。但对long,double等基本类型,由于对它们的操作需要多条指令,不是原子的,所以就不是线程安全的。

这和C/C++中的volatile语义是差不多的,C/C++中的寄存器就是这里的working memory,内存就是main memory。可以说在Java1.4之前,Java和C/C++里volatile的语义基本一致。

但Java1.5里,volatile的语义被扩充完善,自动扩展了对double,float等基本类型为原子操作。(这点我不是很确定,也许有人要拍我了)
分享到:
评论
1 楼 gaohongliang 2011-10-19  

相关推荐

    并发编程一之synchronized和volatile.rar

    在并发编程领域,正确理解和使用同步机制至关重要,其中`synchronized`和`volatile`是Java中两个关键的并发控制工具。本资源"并发编程一之synchronized和volatile.rar"提供了多个示例代码(demo1到demo12),帮助...

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    Java 多线程机制提供了两种实现同步的方式:Synchronized 和 Volatile。 1. Synchronized Synchronized 是 Java 语言中的一个关键字,用于实现线程同步。它可以保证在同一个时刻,只有一个线程可以执行某个方法...

    java同步synchronized关键字用法示例

    Java中的`synchronized`...总之,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了共享资源的安全访问,避免了竞态条件和数据不一致。理解和熟练运用`synchronized`对于编写健壮的并发程序至关重要。

    Java线程之线程同步synchronized和volatile详解

    Java线程之线程同步synchronized和volatile详解 Java线程同步是Java多线程编程中...Java线程同步是Java多线程编程中非常重要的一个方面,需要正确地使用synchronized和volatile关键字来保证线程安全、可见性和有序性。

    java中volatile和synchronized的区别与联系

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

    详解java并发编程(2) --Synchronized与Volatile区别

    Java并发编程中的Synchronized和Volatile详解 在Java并发编程中,Synchronized和Volatile是两个非常重要的概念,它们都是用于实现线程安全的机制。下面我们将详细介绍Synchronized和Volatile的区别和使用。 ...

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

    2. **单例模式中的双重检查锁定**:在实现线程安全的单例模式时,`volatile`关键字可以用来保证实例创建过程中的可见性和有序性,避免多线程环境下可能出现的问题。 3. **懒汉式初始化**:在某些情况下,为了避免...

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...

    volatile和synchronized的区别

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

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

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

    Java线程:volatile关键字

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

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

    【JMM(Java Memory Model,Java 内存模型)】是Java平台中用于规范线程间通信和数据同步的一种模型。它定义了线程如何共享和访问内存,以及在并发环境下如何保证数据一致性。JMM规定了 volatile 变量、synchronized...

    violate java-Java 之 volatile 超级详解

    Java中的`volatile`关键字是多线程编程中一个非常重要的概念,它用于修饰变量,确保在并发环境下,多个线程可以正确地共享和同步数据。本文将深入探讨`volatile`关键字的工作原理、特性以及如何使用它来解决多线程中...

    java synchronized demo

    在Java编程语言中,`...总结,`java synchronized demo`是一个关于如何在Java中使用`synchronized`关键字进行线程同步的示例,通过理解和实践这个例子,开发者可以更好地掌握多线程环境下数据安全和同步的重要性。

    [JAVA][synchronized的使用]

    - **ReentrantLock**:是Java并发包`java.util.concurrent.locks`中的可重入锁,提供了比`synchronized`更细粒度的控制,支持公平锁和非公平锁,以及可中断和可定时的获取锁。 7. **TestSynchronized 示例** 通常...

    一文精通Java中的volatile关键字

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

    java里的volatile关键字详解

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

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

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

    Java 中 synchronized的用法详解(四种用法)

    Java 中的 `synchronized` 关键字是多线程编程中的重要概念,用于实现线程同步,确保在并发环境下数据的一致性和完整性。下面将详细介绍 `synchronized` 的四种主要用法。 1. **修饰实例方法**: 当 `synchronized...

    java基本教程之synchronized关键字java多

    总结,`synchronized`关键字是Java多线程编程中的关键工具,理解并合理运用它,可以帮助开发者编写出高效且线程安全的代码,避免数据竞争和死锁等问题。通过深入学习和实践,可以提升Java程序员在并发编程领域的专业...

Global site tag (gtag.js) - Google Analytics