相关疑难解决方法(0)

不是线程安全的对象发布

在实践中阅读Java并发,第3.5节:提出索赔

public Holder holder;
public void initialize() {
     holder = new Holder(42);
}
Run Code Online (Sandbox Code Playgroud)

除了创建2个Holder实例的明显线程安全危险之外,本书声称可能会出现一个可能的发布问题,对于Holder类来说更是如此

public Holder {
    int n;
    public Holder(int n) { this.n = n };
    public void assertSanity() {
        if(n != n)
             throw new AssertionError("This statement is false.");
    }
}
Run Code Online (Sandbox Code Playgroud)

可以抛出AssertionError!

这怎么可能 ?我能想到的唯一可以允许这种荒谬的行为是,如果Holder构造函数不会被阻塞,那么当构造函数代码仍在不同的线程中运行时,将为该实例创建一个引用.这可能吗 ?

java concurrency thread-safety

14
推荐指数
2
解决办法
2492
查看次数

如何证明未正确发布的值的竞争条件?

我正在阅读"Java Concurrency in practice"并查看第51页的示例代码.

根据该书,如果没有正确发布,这段代码就有可能失败.因为我喜欢编写示例并打破它们来证明它们是如何工作的.我试图让它抛出AssertionError但失败了.(引导我回到上一个问题)

任何人都可以发布示例代码,以便抛出AssertionError吗?规则:不要修改Holder类.

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我修改了类以使其更脆弱但我仍然无法获得AssertionError.

class Holder2 {
    private int n;
    private int n2;

    public Holder2(int n) throws InterruptedException{
        this.n = n;
        Thread.sleep(200);
        this.n2 = n;
    }

    public void assertSanity(){
        if (n != n2) {
            throw new AssertionError("This statement is false");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能使上述任何一个类抛出AssertionError?或者我们是否必须接受他们偶尔会这样做而且我们不能编写代码来证明它?

java concurrency

9
推荐指数
1
解决办法
1597
查看次数

标签 统计

concurrency ×2

java ×2

thread-safety ×1