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