字段上的无效同步¶
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
一段在字段上进行同步并更新该字段(在持有锁时)的代码块不太可能提供所需的线程安全性。此类同步块不会阻止对该字段进行多个非同步赋值,因为它获取的是存储在字段中的对象上的锁,而不是字段本身上的锁。
建议¶
当您想要避免同时更新字段时,请考虑在单独的锁对象上进行同步,而不是在字段本身上进行同步。您可以通过声明一个同步方法并将其用于任何字段更新来实现此目的。
示例¶
在以下示例中,在类 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 ...
}
}
}
参考¶
Java 语言规范:synchronized 语句,synchronized 方法。
Java 教程:锁对象。
常见弱点枚举:CWE-662。