CodeQL 文档

字段上的无效同步

ID: java/unsafe-sync-on-field
Kind: problem
Security severity: 
Severity: error
Precision: medium
Tags:
   - reliability
   - correctness
   - concurrency
   - language-features
   - external/cwe/cwe-662
Query suites:
   - java-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

一段在字段上进行同步并更新该字段(在持有锁时)的代码块不太可能提供所需的线程安全性。此类同步块不会阻止对该字段进行多个非同步赋值,因为它获取的是存储字段中的对象上的锁,而不是字段本身上的锁。

建议

当您想要避免同时更新字段时,请考虑在单独的锁对象上进行同步,而不是在字段本身上进行同步。您可以通过声明一个同步方法并将其用于任何字段更新来实现此目的。

示例

在以下示例中,在类 A 中,同步在 setField 方法的主体中更新的字段上进行。

public class A {
    private Object field;  
    
    public void setField(Object o){
        synchronized (field){    // BAD: synchronize on the field to be updated
            field = o;
            // ... more code ...          
        }
    }
}

在类 B 中,显示了推荐的方法,其中同步在单独的锁对象上进行。

public class B {
   private final Object lock = new Object();
   private Object field;

   public void setField(Object o){
       synchronized (lock){      // GOOD: synchronize on a separate lock object
           field = o;
           // ... more code ...
       }
   }
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私