几个月前我在通过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字段不是最终的,所以潜在的其他代码可能会改变引用,但这仍然不会导致问题,因为主要用途是你不在同一个实例上运行格式SimpleDateFormat同时发生.