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

时间:2015-07-07 16:52:03

标签: 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中实现这些要求?

1 个答案:

答案 0 :(得分:1)

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

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

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