几个月前,我在通过Skype采访一家德国公司时遇到了这个问题。给出以下代码:
private static DateFormat DATE_FORMAT = new SimpleDateFormat();
public void doSomething() {
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (DATE_FORMAT) {
System.out.println(DATE_FORMAT.format(Calendar.getInstance().getTime()));
}
}
}).start();
}
}
说明是否可能存在任何同步问题以及原因。
我的直觉告诉我,不应有任何东西。我们正在创建100个线程,每个线程都将获取同一对象(DATE_FORMAT)上的锁,并以或多或少的精度显示当前时间。但是,我记得采访者提到了一些有关打印不一致的问题,但我无法正确回忆。
提前致谢。
最佳答案
我看不到任何问题,因为有一个关键部分由单个监视器(DATE_FORMAT
)控制,并且没有其他锁存在,因此没有死锁的风险。
我唯一能想到的是DATE_FORMAT字段不是最终字段,因此其他代码可能会更改引用对象,但这仍然不会造成问题,因为此方法的主要用途是您不会在相同的实例上运行format
并发SimpleDateFormat
。