我有以下包装器:
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中实现这些要求?
答案 0 :(得分:1)
一个选项是将现有List包装在Collections.synchronizedList(List<T> list)
的同步版本中。如果通过同步包装器进行所有访问,则允许线程安全地使用List。
请注意,列表中的元素是引用。如果要在对对象进行更改时锁定列表,则需要在更高级别进行同步。一种方法是将方法标记为synchronized
。
public synchronized void update(User u) { ... }