- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
LinkedList
在尝试轮询数据时抛出异常。但我认为我正确地使用了读/写锁的概念。该代码有什么问题?
package sample;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class PingPong extends Thread {
boolean read = false;
Queue<String> queue;
static ReadWriteLock lock = new ReentrantReadWriteLock();
final static Lock readLock = lock.readLock();
final static Lock writeLock = lock.writeLock();
boolean stop;
public PingPong(boolean read, Queue<String> queue) {
this.read = read;
this.queue = queue;
}
int count = 0;
@Override
public String toString() {
return "PingPong{" +
"read=" + read +
", count=" + count +
'}';
}
@Override
public void run() {
if (read) {
while (!stop) {
readLock.lock();
// synchronized (queue) {
try {
String string = queue.poll();
if (string != null) {
count++;
}
} finally {
readLock.unlock();
}
// }
inform();
}
} else {
while (!stop) {
writeLock.lock();
// synchronized (queue) {
try {
if (queue.add("some str" + count)) {
count++;
}
} finally {
writeLock.unlock();
}
// }
inform();
}
}
}
private void inform() {
// Thread.yield();
// synchronized (queue) {
// queue.notify();
// try {
// queue.wait(1);
// } catch (InterruptedException e) {
// e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
// }
// }
}
public static void main(String[] args) throws InterruptedException {
Queue<String> queue = new LinkedList();
// queue = new ArrayBlockingQueue<String>(100);
// queue = new ConcurrentLinkedQueue<String>();
List<PingPong> pongs = new ArrayList<PingPong>();
for (int i = 0; i < 10; ++i) {
PingPong pingPong = new PingPong(i % 2 == 0, queue);
pingPong.start();
pongs.add(pingPong);
}
Thread.sleep(1000);
int sum = 0;
int read = 0;
int write = 0;
for (PingPong pp : pongs) {
pp.stop = true;
pp.join();
}
for (PingPong pp : pongs) {
System.out.println(pp);
sum += pp.count;
if (pp.read) read += pp.count;
else write += pp.count;
}
System.out.println(sum);
System.out.println("write = " + write);
System.out.println("read = " + read);
System.out.println("queue.size() = " + queue.size());
System.out.println("balance (must be zero) = " + (write - read - queue.size()));
}
}
最佳答案
这是因为这个调用改变了 queue
集合:
String string = queue.poll();
来自 Queue Java文档:
Retrieves and removes the head of this queue, or returns null if this queue is empty.
读取锁旨在用于多个线程可以安全地读取,而写入必须以独占方式执行(没有其他读取和写入)的情况。因为您正在使用读锁来轮询
队列(写操作!),所以您实际上允许多个线程同时修改非线程安全的LinkedList
。
在这种情况下,读写锁不是正确的同步机制。
关于java - 为什么这个 ReadWriteLock 示例不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643995/
一 点睛 为了更好地解决多个线程读写带来的并发问题,JUC 还提供了专门的读写锁 ReadWriteLock,可以分别用于对读或写操作进行加锁,ReadWriteLock 在 JDK 中的源码如下所示
我遇到了 Writer 线程在没有获得锁的情况下饥饿的问题。请看下面的代码。如果我尝试使用 tryLock() 获取读锁,写入进程将变得饥饿,并且永远无法写入。即使具有公平性,编写过程也会完全饥饿并且
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
DependingService 依赖于异步动态注入(inject)到 DependingService.setService(Object) 的 service 对象。如果在设置 service 对
前面我们介绍了管程和信号量这两个同步原语在 Java 语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有的并发问题。那 Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分
我在许多教程中遇到了以下 ReadWriteLock 的不可重入实现。 public class ReadWriteLock{ private int readers = 0;
LinkedList 在尝试轮询数据时抛出异常。但我认为我正确地使用了读/写锁的概念。该代码有什么问题? package sample; import java.util.ArrayList; imp
我一直在使用 ReadWriteLock `s 来实现/维护锁定习语。 自 JDK8 StampedLock已介绍。由于 RWLocks 以其缓慢和糟糕的性能而闻名,StampedLock 看起来像是
我们有一些实现缓存的代码。所有方法都具有 synchronized 关键字,并且还在内部使用 ReadWriteLock。简化示例: private final ReadWriteLock _rwLo
我试图理解 ReadWriteLock 的概念并实现了下面的简单示例。据我了解,只要一个线程有一个readlock,另一个线程就可以获得readlock。但是对于一个拥有writelock的线程,其他
我有一个线程从网络服务轮询数据,然后将它发送到不同的类来处理数据。该数据的处理可能需要很长时间,有时甚至超过调用线程内部轮询功能的定时器间隔。 我想保护这个轮询功能,即在数据处理过程中,不要进入该功能
ReadWriteLock 降级被 ReentrantReadWriteLock 实现所允许(下例中的 tryLock() 总是返回 true) : void downgrade(final Read
我试图证明当有很多读者而只有一些写者时,synchronized 会更慢。我以某种方式证明了相反的情况。 RW 示例,执行时间为 313 毫秒: package zad3readWriteLockPe
我正在寻找一种方法将 synchronized 的功能与 java.util.concurrent.locks.ReentrantReadWriteLock 的功能结合起来。更具体地说,我希望只有在设
我需要一个不可重入的 ReadWriteLock,因为锁可能会由与获取它的线程不同的线程释放。 (当我开始间歇性地获得 IllegalMonitorStateException 时,我意识到了这一点。
我有一些数据结构,我想在其中专门锁定写入访问,但启用并行读取访问。 我进行了一些搜索并找到了类(class) ReadWriteLock和 ReentrantReadWriteLock - 两者都提供
我有一个 Map,它被多个线程读取,但(不时)被另一个线程清除和重建。 我已经用包围了这张 map 的所有访问权限 readWriteLock.readLock().lock() try { ..
正如这个问题的几个答案所建议的那样: What is the name of this locking technique? 我实现了一个 ReentrantReadWriteLock 并看到了很大的
我写了这个类来重新加载 DataSource ,由整个应用程序使用,当持久化的配置数据发生变化时。 如您所见,它由 CDI 管理。并公开为 Singleton ,并且“配置更改”事件通过 config
如果您使用位掩码在单个AtomicInteger 中存储读写锁,您能否实现一个快速的ReadWriteLock 类? 它与常规的 ReentrantReadWriteLock 有何不同? 最佳答案 T
我是一名优秀的程序员,十分优秀!