java - 向现有线程安全类添加功能

标签 java multithreading

对于下面的代码,

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);
      }      
   }
}

Java author说,

For each mutable state variable that may be accessed by more than one thread, all accesses to that variable must be performed with the same lock held.

在执行putIfAbsent操作时,这(上面)是线程安全失败的原因吗?

最佳答案

这是错误的锁(在 ListHelper 上同步,而不是在 list 上同步),此外,由于 list 是公开发布的 - 它可以被访问任何拥有 ListHelper 对象指针的人。

将其设置为私有(private),并确保没有人可以直接访问它(除非通过您将提供的同步方法),并确保您在执行读取时也进行同步 - 这样您就可以了。

另一种方法是向读者提供列表的不可修改的副本。

关于java - 向现有线程安全类添加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701633/

相关文章:

c# - 读/写锁定 asp.net 中的静态变量

c++ - 套接字 : multithreading doesn't work when client reads messages

ios - 如何在 Swift 3 中创建线程安全变量?

java - 避免主线程上 I/O 操作的最佳方法是什么

java - 尝试在小部件 ListView 上显示 arraylist<string>

Java 为什么字符串的长度是 36 的两倍,而它只包含 18 个字符?

java - 拆分 Java 构建器以避免多次编写相同的代码

c - 在另一个线程中写入文件是否安全?

java - 使用文件位置显示 'windows explorer'中的文件

java - 为什么我的 JSP 本地函数 '<%!' 出现错误?