java – 为什么同步的getter像volatile一样工作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么同步的getter像volatile一样工作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1379字,纯文字阅读大概需要2分钟。
内容图文
![java – 为什么同步的getter像volatile一样工作?](/upload/InfoBanner/zyjiaocheng/782/72e9341290c8496e9c10ade06f7d22d8.jpg)
该程序不会终止!
public class Main extends Thread {
private int i = 0;
private int getI() {return i; }
private void setI(int j) {i = j; }
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
main.start();
Thread.sleep(1000);
main.setI(10);
}
public void run() {
System.out.println("Awaiting...");
while (getI() == 0) ;
System.out.println("Done!");
}
}
我明白这是因为运行Awaiting循环的CPU核心总是看到i??的缓存副本并且错过了更新.
我也明白,如果我使volatileprivate int i = 0;然后while(getI()…表现为[1]就像每次咨询主内存一样 – 所以它会看到更新的值,我的程序将终止.
我的问题是:如果我做的话
synchronized private int getI() {return i; }
它令人惊讶地工作!该计划终止.
我知道synchronized用于防止两个不同的线程同时进入一个方法 – 但这里只有一个线程进入getI().这是什么巫术呢?
编辑1
This (synchronization) guarantees that changes to the state of the object are visible to all threads
因此,我没有直接拥有私有状态字段,而是进行了以下更改:
代替private int i = 0;我做了私有数据data = new Data();, i = j更改为data.i = j并返回i更改为返回data.i
现在,getI和setI方法没有对定义它们的对象的状态做任何事情(并且可能是同步的).即使现在使用synchronized关键字也会导致程序终止!有趣的是知道状态实际发生变化的对象(数据)没有同步或内置任何内容.那么为什么?
[1]它可能就像那样,实际上,真正发生的事情对我来说是不清楚的
解决方法:
它只是巧合或平台依赖或特定的JVM依赖,它不受JLS保证.所以,不要依赖它.
内容总结
以上是互联网集市为您收集整理的java – 为什么同步的getter像volatile一样工作?全部内容,希望文章能够帮你解决java – 为什么同步的getter像volatile一样工作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。