java 数组值是变量_java – 将数组变量的值赋给自身?

我有这么简单的代码.

class A {

static volatile String[] a = new String[9];

public static void main(String[] args) {

new Thread() {

public void run() {

for (int i = 0; i < a.length; i++) {

while (a[i] == null);

System.out.println(a[i]);

}

}

}.start();

a[0] = "The";

zzz();

a[1] = "quick";

zzz();

a[2] = "brown​";

zzz();

a[3] = "fox";

zzz();

a[4] = "jumped";

zzz();

a[5] = "over";

zzz();

a[6] = "the";

zzz();

a[7] = "lazy";

zzz();

a[8] = "cat";

zzz();

}

public static void zzz() {

try {

Thread.sleep(300);

} catch (Exception e) {}

a=a;

}

}

它输出了我所期望的:

$javac A.java && java A

The

quick

brown​

fox

jumped

over

the

lazy

cat

奇怪的是zzz()中的a = a.当我拿出它时似乎没有任何改变.为什么会这样?

解决方法:

我能想到的唯一原因是编写该代码的人理解只有数组是易失性的而不是其内容,并添加了a = a来强制执行对数组项执行的写操作的可见性.

It doesn’t seem to change anything when I take it out.

它仍然可以在您的机器上使用JVM,但这并不意味着它可以在具有不同JVM的另一台机器上运行.理论上,删除a = a;声明可能导致永无止境的while循环.

边注

我原以为Java内存模型(JMM)可以允许JVM忽略该语句,就像可以忽略synchronized(new Object())一样.

You may have noticed that I did provide a way of getting a volatile write above with just arrays: by writing out a self-reference.

* Jeremy Manson是JMM的作者之一.

标签:java,concurrency,volatile,memory-visibility

来源: https://codeday.me/bug/20190625/1283641.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值