如何解决这个“同步新的”对象“而不是”。

时间:2017-11-15 10:13:07

标签: java sonarqube sonarqube-scan sonarlint

我在声纳的同步线(新整数(计数))中收到警告 而是在新的“对象”上同步。

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;
    }

}

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

  1. 正如Sonar所说,你不应该在原始包装器上进行同步(即Integer,Long,Boolean等),因为这些可以通过自动装箱来创建,而Sonar认为这是有风险的。这是有风险的,因为synchronized语句中使用的锁定对象应该在要同步的所有线程中保持不变。任何可能在程序逻辑中重用的动态对象都很容易导致同步失败。因此,最佳实践是实例化Object并创建仅用于同步的特殊锁定对象。
  2. 您正在使用new Integer(count),即每当输入synchronized块时,都会创建一个新的整数实例。这意味着每个线程都会看到自己的锁对象版本,因此根本不会在线程之间同步该块。为了实现同步,您需要重用所有线程共享的锁对象。
  3. 在你的情况下,有一个静态变量,如

    private static Object lock=new Object();
    

    并在synchronized(lock)中使用这个将确保所有线程确实在块的开头同步。