Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM(Java虚拟机),JVM执行字节码,最终转化为汇编指令在cpu上执行,Java中所使用的并发机制依赖于JVM的实现和cpu的指令。
在多线程中,有时候会遇到这种问题:当一个线程修改了共享变量时,另一个线程不知道这个变量已经被修改(数据修改不是修改原始数据,而是对拷贝的数据进行修改。)了,还是使用以前的变量(存放在一个缓存中),这就会造成某些线程看到的同一个变量的值是不一样的。共享变量的“可见性”就是针对这个问题来实现的。原理如下:
这种情况怎么解决呢?Java提供了两种解决方式:volatile的应用和synchronized的应用。
instance=new singleton(); //instance是volatile变量
转换成汇编代码为:
0x01a3deld:....;
0x01a3de24:lock addl ...
我们可以看到volatile变量修饰的共享变量进行写操作时会多出第二行汇编代码。lock前缀的指令在多喝处理器下会引发两件事:
本文发布于:2024-02-01 10:51:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170675586636099.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |