我有以下包装:
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/