3

私は「Java Concurrency in Practice」を読んでいて、3.5.1 章で例として示したクラスが実際に問題を引き起こす可能性があることを示すコードを書き込もうとしています。

public class Holder {
    public int n;

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

    public void assertSanity() {
        if (n != n) {
            throw new AssertionError("sanity check failed!!");
        }
    }
}

次のように使用すると、フィールドがパブリックであるという事実についてだと思いますが、同時実行性の問題が発生する可能性があると言われています。

public Holder holder;
public void initialize() {
    holder = new Holder(42);
}

だから私は何か悪いことが起こるかどうかを確認するためにこのコードを思いついた.

public class SanityCheck {

    public Holder holder;

    public static void main(String[] args) {

        SanityCheck sanityCheck = new SanityCheck();
        sanityCheck.runTest();

    }

    public void runTest() {
        for (int i = 0; i < 100; i++) {
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        if (holder != null) {
                            holder.assertSanity();
                        }

                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                        }
                    }
                }
            }.start();
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }

        initialize();

    }

    public void initialize() {
        holder = new Holder(42);
    }
}

しかし、悪いことは何も起こらず、AssertionError はスローされていません。

このコードが何もブレーキしない理由を理解するのを手伝ってくれませんか?

よろしくお願いいたします。

4

3 に答える 3