gpt4 book ai didi

Java 优化了读/写共享资源/内存位置而无需 Atomic API,例如原子整数

转载 作者:行者123 更新时间:2023-11-29 07:24:29 25 4
gpt4 key购买 nike

有一个共享资源,我们需要按照下面的方式对其进行读/写操作:

  1. 当正在对资源进行写入时,不应允许读取。
  2. 当读取正在进行时,不允许写入,但多个读取线程应该能够读取。

我已经编写了如下所述的代码,但此代码的问题是当单个读取线程已获取锁时,所有读取都将被阻止。此外,我正在考虑使用 boolean 标志,例如可以读继续。现在,当读取第一次获取锁时,我会将此标志翻转为真,如果为真,则其他线程不应尝试获取锁。

class SharedResource {

Lock writeLock

public Object read() {
writeLock.acquire()
doRead()

}

public void write(Object toBeWritten) {
writeLock.acquire()

doWrite(toBeWritten)

writeLock.release()
}

}

预期是在没有写入时多个线程应该能够读取。

更新 1:

公共(public)类共享资源{

private Object writeLock = new Object();
private volatile boolean canReadContinue;
private volatile int readCount;

public void write(Object newState) throws InterruptedException {
synchronized (writeLock) {
// To make sure no read is going on
while (readCount > 0) {
wait();
}
System.out.println("Write thread has the lock.");
doWrite(newState);
}
}

public Object read() {
if(canReadContinue) {
incrementCount();
} else {
synchronized (writeLock) {
System.out.println("Read thread has the lock.");
canReadContinue = true;
incrementCount();
}
}
Object result = doRead();
decrementCount();
if(readCount == 0) {
// TODO - release lock and notify

}

return result;
}

private synchronized void incrementCount() {
readCount++;
}

private synchronized void decrementCount() {
readCount--;
}


private void doWrite(Object newState) {
// do stuff
}

private Object doRead() {
return "";
}

现在我需要一种机制来在“//TODO - 释放锁并通知”行释放锁,任何指示如何解决这个问题?

最佳答案

提示:

  • 你需要一个互斥锁;例如原始对象锁。
  • 您需要一个当前持有逻辑读锁的读者数量的计数器。
  • 您需要一个标志来说明写入者是否持有逻辑写锁。
  • 当且仅当您获取或释放逻辑锁时,您持有互斥体。一旦获得它,就释放互斥量。
  • 您将需要使用waitnotify

实际上你需要1实现一个简化版本ReadWriteLock


1 - ... 用于您的家庭作业。在现实世界的程序中,您应该简单地使用现有的 ReadWriteLock 类。

关于Java 优化了读/写共享资源/内存位置而无需 Atomic API,例如原子整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56836221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com