`
pan_java
  • 浏览: 289019 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程设置模式 -- Read-Write Lock Pattern

阅读更多
//读写锁
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编程中不可或缺的一部分,它涉及到如何在并发环境中高效、安全地组织代码执行。在Java中,多线程是通过Thread类或实现Runnable接口来创建和管理的。本教程将深入探讨多线程设计模式,帮助...

    design pattern设计模式范例

    在"concurrent"目录下,我们可以找到关于并发编程的设计模式,如线程安全的单例模式实现,或者使用读写锁(Read-Write Lock)来优化多线程环境下的数据访问。并发设计模式是现代多核处理器环境下不可或缺的知识,...

    良葛格DesignPattern学习笔记

    - **Read-Write Lock**(读写锁模式):允许多个读取线程同时访问资源,但只允许一个写入线程访问资源。 - **Thread-Per-Message**(每消息一线程模式):为每个新到达的消息创建一个新的线程。 - **Future**(未来...

    北京一家JAVA开发公司面试题

    - **读写锁(Read/Write Lock)**:允许多个线程同时读取共享资源,但在写入时只允许一个线程访问。 - **生产者-消费者模式**:用于解决线程之间数据传递的问题,其中有一个缓冲区,生产者线程向缓冲区添加数据,...

    MySQL运维-故障处理手册

    - 首先确认系统是否允许产生core dump文件,通常需要设置 `/proc/sys/kernel/core_pattern`。 - 使用 `gdb` 工具来分析core dump文件: ```bash gdb /usr/bin/mysqld core ``` 在GDB环境中,可以通过各种命令...

    Java经典问题答案(带书签).pdf

    - `StringBuffer`线程安全,适合多线程环境。 - `StringBuilder`性能更高,适用于单线程环境。 **Math随机数问题** - `Math.random()`返回一个介于0.0(含)至1.0(不含)之间的双精度值。 - 生成特定范围内的...

    Design patterns for concurent objects

    **读写锁模式(Read-Write Lock Pattern):** 读写锁是一种特殊的锁,它允许多个读取者同时访问共享资源,但在任何时刻只允许一个写入者访问。这提高了程序的并发性,因为多个读取者可以同时进行读操作而不会互相...

    二十三种设计模式【PDF版】

    正因为这点不同,导致建筑的管理模式和软件的管理模式就有很多不同, 有些人认识不到这点,就产生了可以大量使用"软件 蓝领"的想法,因为他羡慕建筑中"民工"的低成本. 要知道软件还有一个与建筑截然相反的责任和用途,那...

    Python英语单词整理.pdf

    41. **file** / **open** / **close** / **read** / **write** / **flush**:文件操作,包括打开、关闭、读取、写入和刷新缓冲区。 42. **try** / **except** / **finally**:异常处理,捕捉并处理程序运行时可能...

Global site tag (gtag.js) - Google Analytics