Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么锁坏了? 公共类ListHelper{ 公开名单= Collections.synchronizedList(新的ArrayList()); ... 公共同步布尔putIfAbsent(E x){ 布尔缺席=!list.contains(x); 如果(缺席) 增加(x); 缺席返回; } }_Java_Multithreading_Locking - Fatal编程技术网

Java 为什么锁坏了? 公共类ListHelper{ 公开名单= Collections.synchronizedList(新的ArrayList()); ... 公共同步布尔putIfAbsent(E x){ 布尔缺席=!list.contains(x); 如果(缺席) 增加(x); 缺席返回; } }

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

我不明白这为什么不起作用

如果我将列表更改为private字段,该代码是否正确?

该代码不起作用(即,无法可靠地同步访问),因为其他代码可以绕过您的
已同步
锁直接访问
列表

将其私有化将防止这种情况的发生

您使用的是
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;
  }
}