- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下对象:
public class DataStructures {
public Map<String, User> registeredUser;
private ReadWriteLock readWriteLock;
public DataStructures() {
this.registeredUser = new ConcurrentHashMap<>();
readWriteLock = new ReentrantReadWriteLock(true);
}
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
}
我有以下 block :
if(user != null && user.status()) {
String userNameList = "";
dataStructures.getReadWriteLock().readLock().lock();//ReentrantReadWriteLock
List<User> userList = new ArrayList<>(dataStructures.registeredUser.values());
//Will perform a sort on the userlist according their initial registration number
Collections.sort(userList, Comparator.comparing(User::getRegistrationId));
for (User tmpUser : userList) {
userNameList += tmpUser.getUsername() + " ";
}
connections.send(connectionId, "10 " + "7 " + userList.size() + " " + userNameList);
dataStructures.getReadWriteLock().readLock().unlock();//ReentrantReadWriteLock
}
如您所见,我锁定了部分代码,以便在没有人尝试编写某些内容时让线程读取此代码。
另外,我有以下代码:
dataStructures.getReadWriteLock().writeLock().lock();//ReentrantReadWriteLock
if(dataStructures.registeredUser.putIfAbsent(username, new User(username, password, dataStructures.registraionId)) == null) {
connections.send(connectionId, "10 " + "01");
dataStructures.registraionId++;
}
else
connections.send(connectionId, "11 " + "01");
dataStructures.getReadWriteLock().writeLock().unlock();//ReentrantReadWriteLock
现在,我知道当第一个代码块发生时,第二个代码块将等待第一个代码块完成,我的问题是在下一个代码块中我是否能够读取尽管我没有提到任何 ReentrantReadWriteLock 锁,但有人会同时写入或读取 dataStructure
对象:
String username = seperate[1];
String password = seperate[2];
User user = dataStructures.registeredUser.get(username);
提前谢谢您!
最佳答案
是的,您将能够在有人持有锁进行写入或读取的同时从 dataStructure 对象中读取数据,因为您正在为 RegisteredUser 使用线程安全的 ConcurrentHashMap。
如果您对注册用户使用普通的 HashMap,您仍然可以从注册用户中读取数据,但您会看到不正确/陈旧的数据,因为普通的 HashMap 不是线程安全的,并且您在没有锁的情况下访问它。
关于java - ReentrantReadWriteLock 阻止我对对象进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54050976/
我想做的是获取当前线程一次保存的readcounts数量。我为此编写了一个包装器,但我的问题是ReadLock()方法返回ReentrantReadWriteLock.WriteLock,所以我之后没
我使用 创建一个 java.util.concurrent.locks.ReentrantReadWriteLock new java.util.concurrent.locks.ReentrantR
ReentrantReadWriteLock使用场景 ReentrantReadWriteLock 是 Java 的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程
JUC同步锁原理源码解析二----ReentrantReadWriteLock 1.读写锁的来源 在开发场景下,对于写操作我们为了保证原子性所以需要上锁,但是对于读操作,由于其不改变
我有以下对象: public class DataStructures { public Map registeredUser; private ReadWriteLock r
使用模式产生的原因如下: 如果条件不存在,我需要读取线程来等待数据。 读锁不支持条件,因此条件应从写锁中获取。 由于读线程会等待条件,因此它也应该获取写锁来等待。 我在类里面有以下锁定义: priva
我在使用带有 ehcache 2.1.0 库的 Websphere 7.x 的生产环境中遇到问题。 Web 容器的线程都在等待咨询或插入缓存。 这是所有 webcontainer 线程挂起时的转储:
我所知道的是: ReadLock和 WriteLock以某种方式互相影响 WriteLock 就像同步 ReadLock 似乎无法单独工作 最佳答案 readLock.lock(); 这意味着如果任何
只是一个关于 Java 中的 ReadWriteLocks 的简单问题(特别是 ReentrantReadWriteLock 实现),因为我发现 sun 文档不清楚。 如果一个线程持有读锁,而另一个线
我有一些类似于 map 的存储空间。我一直在为 get 和 put 方法使用 synchronized(this)。由于此存储主要用于读取,我想到了使用 ReentrantReadWriteLock
从这个问题How to understand the “non-fair” mode of ReentrantReadWriteLock? ,我认为无论哪个线程先到,所有线程都有相同的机会获得锁。 所
我的 Web 应用程序遇到一些并发问题,其中已完成对数据库的写入,并且可能还存在同时读取。写入时会先删除所有行,然后插入新行,因此有可能在数据库为空时进行读取,从而导致错误。我正在使用 Reentra
我熟悉在一个帐户和另一个帐户之间转账时使用同步的并发示例,例如,两个帐户的锁定是根据帐号排序的,这样就不会发生死锁。 我想探索使用 ReentrantReadWriteLock,因为在我看来,这将允许
下面是典型的读写模式(读多写少) private ReadWriteLock lock = new ReentrantReadWriteLock(); private int value;
在 ReentrantReadWriteLock 文档中说: writer can acquire the read lock, but not vice-versa 如果我理解正确,这意味着您可以从
在 B. Goetz 的 Java Concurrency In Practice 中,第 13.5 节说: In Java 5.0, the read lock behaves more like
美好的一天 我有一个关于 ReentrantReadWriteLocks 的问题。我正在尝试解决一个问题,其中多个读取线程应该能够在数据结构上并行操作,而一个写入线程只能单独操作(而没有读取线程处于
请详细解释契约(Contract)。我不知道 ReentrantReadWriteLock 中包含的两个锁是否有某种关联?或者这些只是一捆两把普通锁? 最佳答案 它允许多个线程并发读取资源,但需要一个
与 Java 多线程环境中的 synchronized 关键字相比,我们什么时候应该使用 ReentrantReadWriteLock? 在 Java 中使用 ReentrantReadWriteLo
我现在在我的代码中使用 ReentrantReadWriteLock在树状结构上同步访问。这个结构很大,可以同时被多个线程读取,偶尔会修改其中的一小部分——所以它似乎很适合读写习惯。我知道对于这个特定
我是一名优秀的程序员,十分优秀!