gpt4 book ai didi

java - 如何理解书中java并发实践中的一个例子?

转载 作者:行者123 更新时间:2023-12-01 09:21:23 26 4
gpt4 key购买 nike

Listing 3.15. Class at Risk of Failure if Not Properly Published.

public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if (n != n)
throw new AssertionError("This statement is false.");
}
}

我的第一个问题是为什么javac不优化if (n != n)

以下是我的示例演示

public class TestSync {
private int n;

public TestSync(int n) {
this.n = n;
}

public void assertSanity() {
if(n!=n)
throw new AssertionError("This statement is false");
}

private static TestSync test;
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
if(test == null) test = new TestSync(2);
else test = null;
}
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
while(true) {
if(test != null)
try {
test.assertSanity();
} catch (NullPointerException e) {

}
}
}
}).start();
}
}

我的第二个问题是我做的对吗?因为我运行demo的时候没有出现异常。

更新

1.补充我的第一个问题: javap -c TestSync.class

public void assertSanity();
Code:
0: aload_0
1: getfield #3 // Field n:I
4: aload_0
5: getfield #3 // Field n:I
8: if_icmpeq 21
11: new #4 // class java/lang/AssertionError
14: dup
15: ldc #5 // String This statement is false
17: invokespecial #6 // Method java/lang/AssertionError."<init>":(Ljava/lang/Object;)V
20: athrow
21: return

我认为 javac 会优化 if(n!=n)if(false)并缩小它。

2.为什么我还要加上try{}catch(NullPointerException e)之后if(test != null)

因为我认为字段test可以设置null通过 if(test!=null) 之后的另一个线程.

最佳答案

首先,javac几乎从不优化您正在编译的代码。仅当值为编译时常量时,才需要 javac 在编译时计算表达式,表达式本身形成编译时常量,请参阅 JLS §15.28. Constant Expressions .

然而,操作在运行时得到优化,甚至在没有线程同步措施的情况下,优化器可以使用乐观的假设,比如变量在两次读取之间不会改变。因此,由于读取之间的时间间隔很短,n!=n 表达式一开始计算为 true 的可能性很低,而且几乎永远不会为 true code> 优化器启动后。因此,虽然表达式 n!=n 不能保证始终为 false,但不太可能遇到它为 true 在实践中。

当然,根据墨菲定律,当你试图引发该错误时,这种情况永远不会发生,但偶尔在客户那里发生一次,但永远不会重现......

1 请注意,即使第二个线程由于竞争条件而读取初始 0 值,如果不读取初始值,n!=n 也只会失败在后续读取中再次0

关于java - 如何理解书中java并发实践中的一个例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40144528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com