繁体   English   中英

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

[英]Is it possible to allow different thread both read to and write from the same collection?

我有以下包装:

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包装在一个同步版本中。 如果所有访问都是通过同步包装器进行的,则允许线程安全使用List。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM