我应该同步我的“假时间”类方法吗?

时间:2012-09-26 15:03:57

标签: java time synchronized

我为我的应用程序创建了一个“Fake-time”或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);
 }

所以即时提出一些建议,或者有关同步和天气的知识,我应该在我的方法中使用它。

最好的问候 - 马丁。

1 个答案:

答案 0 :(得分:2)

我只有一个线程更新时间,并根据需要创建字段volatile

我不会以可变的方式使用Date,我会使用long