要做个读者/写者作业,且写者优先级更高,弄了一天,总结一下,肯定有很多错误的地方,希望大家不吝指教,共同进步:
在java中提供了ReentrantReadWriteLock类 ,并可抽取读锁和写锁。读锁可以被多个读操作共享,并且会排斥所有写操作;写锁则互斥所有写操作和读操作。
使用读/写锁的必要步骤:
1)创建ReentrantReadWriteLock对象
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
2) 抽取读锁和写锁:
private Lock readLock = rwl.readlock();
private Lock writeLock = rwl.writelock();
3) 对所有写者加锁:
public double set()
{
writeLock.lock();
try{ doSomething(); }
finally{ writeLock.unlock(); }
}
4) 对所有写者加锁
public double set()
{
readLock.lock();
try{ doSomething(); }
finally{ readLock.unlock(); }
}
这样可以保证 a) 写者之间以及写者和读者之间互斥
b) 同一时间只有一个写者写,多个读者可以同时读
要样读者写着优先级相同,当有大量的读者和极少的写者是,写进程可能很难得到执行。所以当需要写操作优先级更高时,这是不够的。
要解决这个问题,可以在创建一个ReentrantLock对象
Lock accessLock = new ReentrantLock();
获得一个条件对象
Condition readQueue = accessLock.newCondition();
当有一个或多个写者试图进行写操作时,可以使所有试图进行读操作的对象在readQueue上等待,直到所有的写操作完成
因此需要额外维持一个变量 numberWriter,记录写者的数量,初始化为0,当有写者试图写操作时,递增numberWriter:
accessLock.lock();
numberWriter++;
accessLock.unlock();
当完成写操作后,递减numberWriter:
accessLock.Lock();
numberWriter--;
if(numberWriter==0)
readQueue.signalAll();
accessLock.unlock();
那么在进行读操作时要相应的检测这个计数器:
try{ if(numberWriter >0 )
readQueue.await(); }
catch(InterruptedException ie)
{ ie.printStackTrace(); }
这样当有写者请求写操作时,所有之后要进行读操作的读者都是readQueue上等待,直到写操作完成。
文章出处:http://www.diybl.com/course/3_program/java/javashl/20071129/89472.html
分享到:
相关推荐
在实际项目中,Java并发库提供了`java.util.concurrent.locks.ReentrantReadWriteLock`类,它是一个可重入的读写锁,可以更高效地处理读写冲突,但这里我们选择了一个更基础的实现,以便更好地理解读者写者问题的...
1. **锁的不当使用**:如果在实现中没有正确使用`synchronized`或`ReentrantReadWriteLock`,可能会导致读者和写者之间的同步问题。例如,没有在写操作前后正确获取和释放锁,可能导致数据一致性问题。 2. **死锁...
1. **读者写者问题的基本概念**:读者写者问题是当多个线程(读者和写者)需要访问共享资源时,需要确保在任何时候,多个读者可以同时读取资源,但只要有写者在操作,所有读者和写者都不能进行读写。写者之间也需要...
6. **读者-写者问题的变体**:除了基本的版本,还有其他变体,如优先级反转问题,即写者虽然有更高的优先级,但在某些情况下可能被低优先级的读者阻塞。 7. **哲学家就餐问题**:这个经典问题与读者写者问题有些...
在Java中,我们可以使用`ReentrantReadWriteLock`类来实现读者写者问题的公平策略。`ReentrantReadWriteLock`是Java并发包`java.util.concurrent.locks`中的一个锁,它提供了读写锁功能,并且支持公平性和非公平性...
下面是一个简化的Java代码框架,展示了如何使用这些工具来解决读者写者问题: ```java import java.util.concurrent.*; public class ReaderWriterProblem { private final ReadWriteLock lock = new ...
首先,我们来看看如何使用`synchronized`关键字来实现基本的读者写者问题。在Java中,`synchronized`可以锁定对象或者方法,确保同一时间只有一个线程能执行特定的代码块。在这个问题中,我们可以创建一个共享的...
在bd系统内核实验-读者-写者问题源代码中,可能就包含了一些具体的实现方式,如采用自旋锁(Spinlock)或者使用高级的并发原语来优化性能。 总之,读者/写者问题展示了在多线程环境下如何有效控制对共享资源的访问...
在JAVA环境中,我们可以通过使用Java的并发工具类,如`synchronized`关键字、`ReentrantReadWriteLock`等来实现读者写者问题的解决方案。`synchronized`关键字用于保证在同一时刻,只有一个线程(写者)能访问关键...
读者写者问题是一个经典的多线程同步问题,源自计算机科学中的并发控制领域。在该问题中,多个读者和一个写者共享一个数据区域。读者同时读取数据时不会互相影响,但当写者正在更新数据时,必须确保没有其他读者或写...
在Java的`java.util.concurrent.locks`包中,我们可以使用`ReentrantReadWriteLock`来实现读者写者问题,它提供了一个读锁和一个写锁,允许多个读者同时持有读锁,但写锁是互斥的。 3. **Semaphore**:信号量可以...
读写者问题旨在确保在任何时候,多个读者可以同时读取数据,而写入者与任何其他进程(无论是读者还是另一个写入者)都不能同时进行操作,以避免数据一致性问题。这里,我们通过Java编程语言来模拟这个操作系统概念。...
读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁...
操作系统中的“读写者问题”是一个经典的多线程并发控制问题,主要涉及到多个读者和一个写者对共享资源的访问。在这个Java实现的案例中,我们看到如何通过编程技术来解决这个问题,确保读写操作的正确性和数据一致性...
在IT行业中,"读者与写者问题"是一个经典的多线程同步问题,它涉及到如何在多个线程之间安全地共享资源。在这个问题中,我们通常有两个类型的线程:读者和写者。读者线程需要读取共享数据,而写者线程则需要修改这些...
非公平锁默认情况下优先级更高,能提供更高的吞吐量。 - **锁降级**:支持从写锁降级到读锁的操作。 ### 二、ReentrantReadWriteLock详解 #### 2.1 ReentrantReadWriteLock的实现 `ReentrantReadWriteLock`是Java...
ReadWriteLock 接口及其实现 ReentrantReadWriteLock 方法 在 Java 并发编程中,锁机制是非常重要的一种同步机制,用于解决多线程之间的资源竞争问题。在 Java 中,有多种锁机制,如 ReentrantLock、...
在读锁的实现中,ReentrantReadWriteLock支持读锁的重入,而写锁同样支持重入,但写锁具有更高的优先级,即使有多个线程在等待读锁,只要写锁被持有,这些线程都将被阻塞。 此外,ReentrantReadWriteLock还提供了...
- ReentrantReadWriteLock允许更高的并发性。当多个线程只需要读取共享数据时,它们可以同时持有读锁,而不会阻塞彼此。只有在写操作发生时,才会阻止其他读或写操作。 - 可重入性:持有读锁或写锁的线程可以再次...
总的来说,Java的`ReentrantReadWriteLock`是解决读者-写者问题的有效工具,通过它可以实现高并发环境下的高效数据共享。在实际应用中,开发者应根据具体需求选择合适的并发控制策略,以保证数据的一致性和程序的...