[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 13439] Re: コンストラクタ内で初期化するフィールドの可視性(宿題)



高橋(徹)です。

Java言語仕様第3版のサンプルベースのものを添付します。

(2011/01/26 11:20), TAKAHASHI, Tomohiro wrote:
> 高橋(智)です。
> 徹さんの作成されたサンプルコード一式をメールに添付するのは可能ですか?
> 私も他の環境で試してみようと思います。
>


/*
 * Java言語仕様 第3版 17.5 「finalフィールドのセマンティックス」 考察に載せられた
 * サンプルコード FinalFieldExampleを、java.util.concurrent.ExecutorServicesの
 * invokeAllで同時に6スレッド実行させ、非finalフィールドの読み出しを確認するよう追加した。
 */

package finalfield;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FinalFieldExample {
    final int x;
    int y;
    static FinalFieldExample f;
    static final int NUM_BUSY_LOOP = 100000;
    
    public FinalFieldExample() {
        x = 3;
        y = 4;
    }
    static void writer() {
        f = new FinalFieldExample();
    }
    static void reader() {
        if (f != null) {
            int i = f.x;
            int j = f.y;
            if (i != 3) System.err.println("Oh! No! final field is not 3.");
            if (j != 4) System.err.println("Oh! No! non final field is not 4.");
        } else {
            //System.err.println("Wow! f is null!");
        }
    }
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(6);

        List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
        for (int i = 1; i < 6; i++) {
            tasks.add(new Callable<Void>() {
                public Void call() {
                    for (int i = 0; i < NUM_BUSY_LOOP; i++) {
                        FinalFieldExample.reader();
                    }
                    System.out.println("reader task completed");
                    return null;
                }
            });
        }
        tasks.add(new Callable<Void>() {
            public Void call() {
                System.out.println("writer task invoked");
                FinalFieldExample.writer();
                return null;
            }
        });
        try {
            System.out.println("now invoking tasks...");
            executor.invokeAll(tasks);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

}