//读写锁
public final class ReadWriteLock {
private int readingReaders = 0; // (A)...实际正在读取的执行绪数量
private int waitingWriters = 0; // (B)...正在等待写入的执行绪数量
private int writingWriters = 0; // (C)...实际正在写入的执行绪数量
private boolean preferWriter = true; // 写入优先的话,值为true
public synchronized void readLock() throws InterruptedException {
//当有实际写入和当优先写入时有等待写入时等待写入线程
while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) {
wait();
}
readingReaders++; // (A)实际正在读取的线程数量加1
}
public synchronized void readUnlock() {
readingReaders--; // (A)实际正在读取的线程数量减1
preferWriter = true;
//唤醒写线线程
notifyAll();
}
public synchronized void writeLock() throws InterruptedException {
waitingWriters++; // (B)正在等待写入的线程数量加1
try {
//当读线程大于或都写线程等待
while (readingReaders > 0 || writingWriters > 0) {
wait();
}
} finally {
waitingWriters--; // (B)正在等待写入的线程数量减1
}
writingWriters++; // (C)实际正在写入的线程数量加1
}
public synchronized void writeUnlock() {
writingWriters--; // (C)实际正在写入的线程数量减
preferWriter = false;
//唤醒读写线程
notifyAll();
}
}
读线程
public class ReaderThread extends Thread {
private final Data data;
public ReaderThread(Data data) {
this.data = data;
}
public void run() {
try {
while (true) {
char[] readbuf = data.read();
System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf));
}
} catch (InterruptedException e) {
}
}
}
写线程
public class WriterThread extends Thread {
private static final Random random = new Random();
private final Data data;
private final String filler;
private int index = 0;
public WriterThread(Data data, String filler) {
this.data = data;
this.filler = filler;
}
public void run() {
try {
while (true) {
char c = nextchar();
data.write(c);
Thread.sleep(random.nextInt(3000));
}
} catch (InterruptedException e) {
}
}
private char nextchar() {
char c = filler.charAt(index);
index++;
if (index >= filler.length()) {
index = 0;
}
return c;
}
}
数据
public class Data {
private final char[] buffer;
private final ReadWriteLock lock = new ReadWriteLock();
public Data(int size) {
this.buffer = new char[size];
for (int i = 0; i < buffer.length; i++) {
buffer[i] = '*';
}
}
public char[] read() throws InterruptedException {
lock.readLock();
try {
return doRead();
} finally {
lock.readUnlock();
}
}
public void write(char c) throws InterruptedException {
lock.writeLock();
try {
doWrite(c);
} finally {
lock.writeUnlock();
}
}
private char[] doRead() {
char[] newbuf = new char[buffer.length];
for (int i = 0; i < buffer.length; i++) {
newbuf[i] = buffer[i];
}
slowly();
return newbuf;
}
private void doWrite(char c) {
for (int i = 0; i < buffer.length; i++) {
buffer[i] = c;
slowly();
}
}
private void slowly() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
}
}
测试类
public class Main {
public static void main(String[] args) {
Data data = new Data(10);
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new WriterThread(data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ").start();
new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start();
}
}
jdk1.5新特性读写锁
public class Data {
private final char[] buffer;
//private final ReadWriteLock lock = new ReadWriteLock();
//读写锁
private ReadWriteLock lock = new ReentrantReadWriteLock();
//生成读锁
private Lock readLock = lock.readLock();
//生成写锁
private Lock writeLock = lock.writeLock();
public Data(int size) {
this.buffer = new char[size];
for (int i = 0; i < buffer.length; i++) {
buffer[i] = '*';
}
}
public char[] read() throws InterruptedException {
readLock.lock();
try {
return doRead();
} finally {
readLock.unlock();
}
}
public void write(char c) throws InterruptedException {
writeLock.lock();
try {
doWrite(c);
} finally {
writeLock.unlock();
}
}
private char[] doRead() {
char[] newbuf = new char[buffer.length];
for (int i = 0; i < buffer.length; i++) {
newbuf[i] = buffer[i];
}
slowly();
return newbuf;
}
private void doWrite(char c) {
for (int i = 0; i < buffer.length; i++) {
buffer[i] = c;
slowly();
}
}
private void slowly() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
}
}
分享到:
相关推荐
Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境中高效、安全地组织代码执行。在Java中,多线程是通过Thread类或实现Runnable接口来创建和管理的。本教程将深入探讨多线程设计模式,帮助...
在"concurrent"目录下,我们可以找到关于并发编程的设计模式,如线程安全的单例模式实现,或者使用读写锁(Read-Write Lock)来优化多线程环境下的数据访问。并发设计模式是现代多核处理器环境下不可或缺的知识,...
- **Read-Write Lock**(读写锁模式):允许多个读取线程同时访问资源,但只允许一个写入线程访问资源。 - **Thread-Per-Message**(每消息一线程模式):为每个新到达的消息创建一个新的线程。 - **Future**(未来...
- **读写锁(Read/Write Lock)**:允许多个线程同时读取共享资源,但在写入时只允许一个线程访问。 - **生产者-消费者模式**:用于解决线程之间数据传递的问题,其中有一个缓冲区,生产者线程向缓冲区添加数据,...
- 首先确认系统是否允许产生core dump文件,通常需要设置 `/proc/sys/kernel/core_pattern`。 - 使用 `gdb` 工具来分析core dump文件: ```bash gdb /usr/bin/mysqld core ``` 在GDB环境中,可以通过各种命令...
- `StringBuffer`线程安全,适合多线程环境。 - `StringBuilder`性能更高,适用于单线程环境。 **Math随机数问题** - `Math.random()`返回一个介于0.0(含)至1.0(不含)之间的双精度值。 - 生成特定范围内的...
**读写锁模式(Read-Write Lock Pattern):** 读写锁是一种特殊的锁,它允许多个读取者同时访问共享资源,但在任何时刻只允许一个写入者访问。这提高了程序的并发性,因为多个读取者可以同时进行读操作而不会互相...
正因为这点不同,导致建筑的管理模式和软件的管理模式就有很多不同, 有些人认识不到这点,就产生了可以大量使用"软件 蓝领"的想法,因为他羡慕建筑中"民工"的低成本. 要知道软件还有一个与建筑截然相反的责任和用途,那...
41. **file** / **open** / **close** / **read** / **write** / **flush**:文件操作,包括打开、关闭、读取、写入和刷新缓冲区。 42. **try** / **except** / **finally**:异常处理,捕捉并处理程序运行时可能...