[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();
        }
    }
}