看下面一段代码,预想的输出结果为 42
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
number = 42;
ready = true;
}
}
此段代码有可能输出 0 或者 reader线程死循环
导致这种错误出现的原因
- CPU 内部的缓存:现在的CPU一般都拥有层次结构的几级缓存。CPU直接操作的是缓存中的数据,并在需要的时候把缓存中的数据与主存进行同步。因此在某些时刻,缓存中的数据与主存内的数据可能是不一致的。某个线程所执行的写入操作的新值可能当前还保存在CPU的缓存中,还没有被写回到主存中。这个时候,另外一个线程的读取操作读取的就还是主存中的旧值。
- CPU的指令执行顺序:在某些时候,CPU可能改变指令的执行顺序。这有可能导致一个线程过早的看到另外一个线程的写入操作完成之后的新值。
- 编译器代码重排:出于性能优化的目的,编译器可能在编译的时候对生成的目标代码进行重新排列。
因为在没有同步机制的下,语句的执行顺序不能得到保证。尽管我们得代码number的复制在ready之前,但这并不能保证jvm内部执行也会按照这个顺序,导致读线程出现错误。
更详细内容请参考:Java深度历险(三)——Java线程:基本概念、可见性与同步
分享到:
相关推荐
护肤品零售可见性报告 Skin Care Retail Visibility Report.pdf
在线社交网络中的社交可见性服务定价模型与算法_Pricing Social Visibility Service in Online Social Networks Modeling and Algorithms.pdf
Flutter Offstage、Visibility隐藏/可见。
Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。
主要介绍了jQuery可见性过滤器:hidden和:visibility用法,实例分析了:hidden和:visibility的功能及相关使用技巧,需要的朋友可以参考下
VISIBILITY属性的详解包括VISIBLE、INVISIBLE及GONE区别
可见性.js 用于使用页面可见性 API 的跨浏览器插件安装下载: : bower install visibility.js Git: git clone https://github.com/alexgibson/visibility.js设置此组件可用作 AMD 模块、CommonJS 模块或全局。 要...
1.1 Notion of Visibility 1 1.2 Polygon 2 1.3 Asymptotic Complexity 5 1.4 Triangulation 6 1.5 The Art Gallery Problem 8 1.6 Special Types of Visibility 11 2 Point Visibility 13 2.1 Problems and Results...
加载项以禁用页面可见性API。 如果您当前在另一个窗口中,这可以防止会议系统跟踪。 此插件禁用页面可见性API。 例如,这可防止视频会议系统检测到您是在其选项卡中还是在另一个窗口中。 可以在以下位置找到此插件的...
用法watcher = require('visibility')() 创建一个新的EventEmitter ,当页面的可见性状态更改时,该事件将触发特定事件。watcher.hidden() 如果浏览器窗口当前不可见,则返回true 。 如果浏览器不支持Page ...
WPF的bool2Visibility转换器使用
.imgbox { float:left; text-align:center; width:120px;...CSS Display(显示) 与 Visibility(可见性) display属性设置一个元素应如何显示,visibility属性指定一个元素应可见还是隐藏。 Box 1 Box
Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。1) 可见(visible)XML文件:android:visibility=”visible”Java...
display与visibility的区别
区块可见性 使您可以动态控制WordPress网站上可见的块以及谁可以看到它们,其中包括计划块的功能。 该插件是为新的Block(Gutenberg)编辑器而构建的,旨在与任何WordPress块一起使用。 这包括WordPress本身提供的块...
内容可见性 是一个简单的Web组件,封装了现代CSS属性content-visibility和Web API Intersection Observer API,以提供跨浏览器解决方案来跳过渲染(布局和绘画)元素,直到需要(出现在视口上)来增强效果页面性能。...
React页面可见性 声明式,嵌套式,有状态,同构的页面可见性 动机 您是否定期轮询后端? 您正在播放动画吗? 如果您的标签页不再可见,该怎么办? 请参阅更多经典用例。 现在,您可以轻松保存带宽和GPU计算,从而...
JS中style.display和style.visibility的区别实例说明.docx
进度条 运行状态提示有三种visibility形态 visible 控件可见且占据界面的空间 invisible 控件不可见,仍占据界面空间 gone 控件不可见,也不占据空间 进度条 运行状态应用: 在布局中插入一个ProgressBar标签,默认...
前端项目-visibility.js,Wrapper for the Page Visibility API