Date().getTime()スレッド詰まりの問題

1399 ワード

new Date().gettime()はスレッド詰まりの問題が発生する確率は低いが,いったん発生すると性能も大幅に低下し,次のコードはこの問題をテストし,10個のスレッドを作成し,絶えず実行することができる.
この方法はgetJulianCalendar()を参照しているため、
    synchronized private static final BaseCalendar getJulianCalendar() { if (jcal == null) {    jcal = (BaseCalendar) CalendarSystem.forName("julian"); } return jcal;     }
テストコード:
public class DuMain {

	public static void main(String[] args) {
		long time = System.currentTimeMillis();
		test();
		long end = System.currentTimeMillis();
		System.out.println(end - time);
		
		//................
		for(int i=0;i<10;i++){
			new Thread(){
	
				@Override
				public void run() {
					for(int i=0;i<1000000000;i++){
						test();
	//					System.out.println(i);
					}
				}
				
			}.start();
		}
		for(int i=0;i<1000000000;i++){
			time = System.currentTimeMillis();
			test();
			end = System.currentTimeMillis();
			System.out.println(""+i+"--"+(end - time));
//			System.out.println(i);
		}
		
	}

	public static boolean test() {

		Date begin = new Date();
		int ONE_SECOND = 2;
		boolean result = false;
		while (true) {
			if (new Date().getTime() - begin.getTime() >= ONE_SECOND) {
				result = true;
				break;
			}
		}

		return result;

	}
}

result:
....
11423--2 11424--274 11425--2 11426--3
....
一定回数運行しているとブロックされることがわかります
フル集約サイト