java 同步块中的变量为什么,与Java中的易失性字段和同步块之间发生过关系-以及它们对非易失性变量的影响?...

我对线程的概念还很陌生,并尝试进一步了解它。最近,我遇到了Jeremy Manson撰写的关于Java中的Volatile Means的博客文章,他在文章中写道:

当一个线程写一个易失性变量,而另一个线程看到该写操作时,第一个线程向第二个线程告知内存的所有内容,直到它执行对该易失性变量的写操作为止。[...] 所有的由线程1看到的存储内容,才写信给[volatile] ready,必须是可见的主题2,它读取值后true进行ready。[我自己加重]

现在,这是否意味着在写入volatile变量时线程1的内存中保存的所有变量(无论是否为volatile)在读取该volatile变量后对线程2都是可见的?如果是这样,是否有可能从Java官方文档/ Oracle来源中一起混淆该声明?从哪个Java版本开始可以使用?

特别是,如果所有线程共享以下类变量:

private String s = "running";

private volatile boolean b = false;

线程1首先执行以下命令:

s = "done";

b = true;

然后线程2随后执行(在线程1写入volatile字段之后):

boolean flag = b; //read from volatile

System.out.println(s);

是否可以保证打印“完成”?

如果b在volatile我将写入和读取放入一个synchronized块时没有声明,该怎么办?

此外,在名为“ 线程之间共享静态变量吗? ”的讨论中,@ TREE 写道:

不要使用volatile来保护多个共享状态。

为什么?(抱歉;我无法在其他问题上发表评论,否则我会在那儿问...)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值