我为我的应用程序创建了一个“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);
}
所以即时提出一些建议,或者有关同步和天气的知识,我应该在我的方法中使用它。
最好的问候 - 马丁。
答案 0 :(得分:2)
我只有一个线程更新时间,并根据需要创建字段volatile
。
我不会以可变的方式使用Date
,我会使用long
。