Java 为什么锁坏了? 公共类ListHelper{ 公开名单= Collections.synchronizedList(新的ArrayList()); ... 公共同步布尔putIfAbsent(E x){ 布尔缺席=!list.contains(x); 如果(缺席) 增加(x); 缺席返回; } }
我不明白这为什么不起作用 如果我将列表更改为private字段,该代码是否正确?该代码不起作用(即,无法可靠地同步访问),因为其他代码可以绕过您的Java 为什么锁坏了? 公共类ListHelper{ 公开名单= Collections.synchronizedList(新的ArrayList()); ... 公共同步布尔putIfAbsent(E x){ 布尔缺席=!list.contains(x); 如果(缺席) 增加(x); 缺席返回; } },java,multithreading,locking,Java,Multithreading,Locking,我不明白这为什么不起作用 如果我将列表更改为private字段,该代码是否正确?该代码不起作用(即,无法可靠地同步访问),因为其他代码可以绕过您的已同步锁直接访问列表 将其私有化将防止这种情况的发生 您使用的是synchronizedList(如果其中涉及的同步锁与您的方法使用的同步锁相同,则会有所帮助,但事实并非如此) 如果要将列表保持为公共,可以更新方法以在同一个锁上同步(即列表本身) 这种方法是。我不知道您想要在那里实现什么以及为什么任何东西都不起作用,但看起来您正在模拟一个集合,并且可能
已同步
锁直接访问列表
将其私有化将防止这种情况的发生
您使用的是synchronizedList
(如果其中涉及的同步锁与您的方法使用的同步锁相同,则会有所帮助,但事实并非如此)
如果要将列表
保持为公共,可以更新方法以在同一个锁上同步(即列表
本身)
这种方法是。我不知道您想要在那里实现什么以及为什么任何东西都不起作用,但看起来您正在模拟一个集合
,并且可能希望在列表
上使用它。
public class ListHelper<E> {
public List<E> list =
Collections.synchronizedList(new ArrayList<E>());
...
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}