1

アプリケーション用に「偽の時間」または TimeSource を作成しています。ポイントは、この新しいクラスがアプリケーションの実際の時間を制御する必要があるということです。これは、Date() コンストラクター、System.currentTimeInMillis()、または Calendar.getInstance() を使用するすべてのメソッドが、代わりに私のクラス (例: TimeSource.getInstance.getCurrentTimeInMillis()) を使用する必要があることを意味します。

このようにして、テスト環境でシステムの実際の時間を操作できます。

しかし、これらのメソッドを同期する必要があるかどうか、またはどのように同期する必要があるのだろうか。

次のコードをお見せします。

public class DateTime {

private static final long ONE_MINUTE = 60 * 1000;
private static final long ONE_HOUR = ONE_MINUTE * 60;
private static final long ONE_DAY = ONE_HOUR * 24;
private static final long ONE_MONTH = ONE_DAY * 30;
private static final long ONE_YEAR =  ONE_DAY * 364;

private static DateTime instance;

private Date date;
private Date staticDate;

private boolean isStatic = false;

private long addedTimeInMilliseconds = 0;

public static DateTime getInstance() {
    if (instance == null) {
        instance = new DateTime();
    }
    return instance;
}

private DateTime() {
    date = new Date(System.currentTimeMillis());
    staticDate = new Date(System.currentTimeMillis());
}

public Date getCurrentTime() {
    if (isStatic) {
        return staticDate;
    } else {
        date.setTime(System.currentTimeMillis()+this.addedTimeInMilliseconds);
        return date;
    }
}

public long getCurrentTimeInMillis() {
    if (isStatic) {
        return staticDate.getTime();
    } else {
        return System.currentTimeMillis()+this.addedTimeInMilliseconds;
    }
}

}

シングルスレッドテストとマルチスレッドテストの両方のメソッドでいくつかのテストを実行しましたが、同期化されたメソッドを使用した場合のパフォーマンスは、同期化されていない場合よりもはるかに悪くなります。問題は、メソッドを同期しないと将来的に問題が発生する可能性があるかどうかわからないことです。

また、いくつかの方法を使用して、「現在のアプリケーションの時間」に追加します

public void addMinutesToDateTime(int minutes) {
     this.addedTimeInMilliseconds += (minutes * ONE_MINUTE);
 }

だから私はちょっとしたアドバイスや同期についての知識を求めています.

よろしくお願いします - マーティン。

4

1 に答える 1

2

I would have only one thread updating the time and make the fields volatile if needed.

I wouldn't use Date in a mutable way, I would use long.

于 2012-09-26T15:08:21.940 に答える