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

如果需要,我将只有一个线程更新时间并制作字段volatile

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

于 2012-09-26T15:08:21.940 回答