java - 是否可以允许不同的线程读取和写入同一个集合?

标签 java multithreading

我有以下包装:

public UserContianer{

    private List<User> users;


    public void add(User u){
         users.add(u)
    }

    public void update(User u){
        if(users.contains(u))
             //updating with the new value u
    }

    public User get(int index){
        return users.get(index);
    }
}

我需要允许多个线程同时读取和写入容器,以便

  • 如果列表的读取和写入元素不同 - 那应该没问题
  • 如果列表中读取和写入的元素相同,则

    • 如果已经有线程更新元素,则所有读取操作都应被阻止,直到写入操作完成

    • 如果有线程读取某个元素,则所有写入操作都应被阻止,直到读取完成

首先,这样的要求有意义吗?我是多线程新手,也许这实际上不是我想要的。

第二,是否可以用Java实现这个需求?

最佳答案

一种选择是将现有列表包装在同步版本中 Collections.synchronizedList(List<T> list) 。如果所有访问都是通过同步包装器进行的,则这允许线程安全地使用 List。

请注意,列表中的元素是引用。如果您想在更改对象时锁定列表,则需要在更高级别进行同步。一种方法是将方法标记为 synchronized .

 public synchronized void update(User u) { ... }

关于java - 是否可以允许不同的线程读取和写入同一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274779/

相关文章:

java - 为什么在Java中使用[]创建数组而不是创建数组对象?

java - 使用 RxJava + Retrofit 对列表中的每一项进行 API 请求

c# - 数组的ReaderWriterLock

android - Cordova 插件阻塞线程

java - 用 Java 数组中的特殊字符替换用户输入中的元音

java - 枚举具有 N 个元素的一维数组的所有 k 分区?

c++ - 如何正确地将此指针传递给 std::thread

python - 使用 RPy 进行多处理安全吗?

java - selenium 找不到出现在我的浏览器中的 iframe

c++ - 将 thread::id 的 std::map 创建为整数值