这是我的 Java 1.6 类:
public class Foo {
private ArrayList<String> names;
public void scan() {
if (names == null) {
synchronized (this) {
this.names = new ArrayList<String>();
// fill the array with data
}
}
}
}
查找错误 说:
Inconsistent synchronization of com.XXX.Foo.names; locked 40% of time
这是什么意思以及我做错了什么?我试图避免两个或多个客户致电时出现问题Foo.scan()
同时。
这是因为您仅在设置时才进行同步names
变量而不是当你阅读它时。因此,在读取和写入之间,另一个线程可以执行,您将创建两个 ArrayList 并用数据填充它们,创建的第一个将被 GC 回收。
您需要将同步块放在读取和写入周围,或者将同步修饰符添加到方法中。
public class Foo {
private ArrayList<String> names;
public void scan() {
synchronized (this)
if (names == null) {
this.names = new ArrayList<String>();
// fill the array with data
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)