JAvaクラスのstaticブロック


偶然の考え:staticブロックがマルチスレッド環境でも一度しか実行できないかどうかをテストする
package com.study.thread;

/** 
 *                       static 
 * @author CrazyPig
 *
 */
public class ThreadSyn {
	
	private static int count = 0;
	
	static {
		System.out.println("start static block");
		try {
			Thread.sleep(5000);
		} catch(InterruptedException e) {
			System.out.println("      ");
		}
		count ++;
		System.out.println("end static block");
	}
	
	public static void print() {
		System.out.println("count = " + count);
	}
	
	public void print0() {
		System.out.println("print0()");
	}
	
	public static void main(String[] args) {
		
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				//     static
				ThreadSyn.print();
			}
		});
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				ThreadSyn newInstance = new ThreadSyn();
				newInstance.print0();
			}
		});
		
		t1.start();
		t2.start();
	}
	
}
テストの結果、クラスのstaticブロックはマルチスレッド環境でも一度しか実行できないことが証明され、JVMによって保証された.