当前位置:首页 > 开发 > 编程语言 > Java > 正文

Java中的synchronized和volatile

发表于: 2014-05-04   作者:aoyouzi   来源:转载   浏览:
摘要: 说到Java的线程同步问题肯定要说到两个关键字synchronized和volatile。说到这两个关键字,又要说道JVM的内存模型。JVM里内存分为main memory和working memory。 Main memory是所有线程共享的,working memory则是线程的工作内存,它保存有部分main memory变量的拷贝,对这些变量的更新直接发生在working memo

说到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等基本类型为原子操作。

Java中的synchronized和volatile

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1、Java线程的状态 1. 新建状态(New):新创建了一个线程对象。 2. 就绪状态(Runnable):线程对
1、Java线程的状态 1. 新建状态(New):新创建了一个线程对象。 2. 就绪状态(Runnable):线程对
多线程编程在项目中的应用极为重要,深刻理解JAVA在多线程的实现原理,可以有效解决各种并发问题。
区分volatile和 synchrozied的使用场景,首先需要了解多线程环境下,线程的工作方式 (转载) 在多线
区分volatile和 synchrozied的使用场景,首先需要了解多线程环境下,线程的工作方式 (转载) 在多线
参考文章: ----------------------- 1.正确使用volatile变量 2.百度知道 3.java中的volatile关键字
http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html http://blog.sina.com.cn/s/blo
java中volatile关键字 学习ImageLoader源码时遇到遇到这么一个关键字,以前没遇到过,也不明白是何
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进
1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Ja
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号