您的位置:首页 > 编程语言 > Java开发

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

2017-04-29 17:07 736 查看
Java代码在编译后编程Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。

一、volatile的应用

在多线程并发编程中synchronized和volatile都扮演者重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。“可见性”指的是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为他不会引起线程上下文的切换和调度。本文将深入分析在硬件层面上Intel处理器是如何实现volatile的,通过深度分析帮助我们正确地使用volatile变量。

1.1volatile的定义与实现原理

Java编程语言允许线程访问共享变量,为了能确保共享变量能被准确和一致地更新,线程应该确保通过拍他所单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明称volatile, Java线程内存模型确保所有线程看到这个变量的值是一致的。



CPU术语

为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2或者其他)后,再进行操作,
但操作完你知道何时会写到内存。如果对声明了volatile的变量进行写操作,JVM就会想处理器发送一条Lock前缀的执行,
将这个变量所在缓存航的数据街回到系统内存。但是就算是写回到内存,如果其他处理器缓存的值是旧的,再执行计算操作就会有问题。
所以,在多处理器下,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存航设置为无效。
当处理器对这个数据进行修改操作的时候,会重新从系统内存中吧数据读到处理器缓存里面。

Synchronized的实现原理和应用

Java中的每一个对象都可以作为锁。具体表现有以下三种形式。

对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的Class对象。
对于同步方法快,锁是Synchonronized括号里面的内置对象。
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或跑出异常时必须释放锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: