刚开始看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等基本类型为原子操作。(这点我不是很确定,也许有人要拍我了)
分享到:
相关推荐
Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)
主要介绍了Java线程之线程同步synchronized和volatile详解,具有一定参考价值,需要的朋友可以了解下。
主要介绍了java中volatile和synchronized的区别与联系的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下
主要为大家详细介绍了Java关键字volatile和synchronized的作用和区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了java 高并发中volatile的实现原理的相关资料,在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,需要的朋友...
主要介绍了Synchronized与Volatile区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高并发、线程...
主要介绍了java多线程中的volatile和synchronized用法分析,以实例的形式分析了在多线程中volatile和synchronized的用法区别与使用原理,具有一定的参考借鉴价值,需要的朋友可以参考下
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...
Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料
Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性...
1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、...
synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁,而volatile就可以说是JVM提供的最轻量级的同步机制。JMM告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存...
主要为大家解析了java中volatile关键字,经常有人把volatile关键字和synchronized或者lock混淆,本文就为大家好好区分,感兴趣的小伙伴们可以参考一下
它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight ...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
核心类库包含一个Thread类,可以用它来构建、启动和操纵线程,Java语言包括了跨线程传达并发性约束的构造--synchronized和volatile。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,...
Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized 的目的是一次只允许一个线程进入由他修饰的代码段,从而允许他们进行自我保护。Synchronized 很像生活中的锁例子,进入由...
java面试题_java-interview-questions-master.zip2、在 Java 程序中怎么保证多线程的运行安全? 出现线程安全问题的原因一般都是三个原因: 1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...