我在声纳的同步线(新整数(计数))中收到警告 而是在新的“对象”上同步。
public class PRMDataTransferHelper {
/** static variable to keep count */
private static int count = 0;
private static void done() {
synchronized (new Integer(count)) {
count--;
if (0 == count) {
cleanUp();
}
}
return;
}
}
答案 0 :(得分:2)
这里有两个问题:
synchronized
语句中使用的锁定对象应该在要同步的所有线程中保持不变。任何可能在程序逻辑中重用的动态对象都很容易导致同步失败。因此,最佳实践是实例化Object并创建仅用于同步的特殊锁定对象。 new Integer(count)
,即每当输入synchronized
块时,都会创建一个新的整数实例。这意味着每个线程都会看到自己的锁对象版本,因此根本不会在线程之间同步该块。为了实现同步,您需要重用所有线程共享的锁对象。在你的情况下,有一个静态变量,如
private static Object lock=new Object();
并在synchronized(lock)
中使用这个将确保所有线程确实在块的开头同步。