`
pan_java
  • 浏览: 287890 次
  • 性别: 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) {
		}
	}
}
分享到:
评论

相关推荐

    模拟jdbc多线程竞争资源---【Eclipse项目】

    理解Java的Thread类、Runnable接口以及同步机制(如synchronized关键字、Lock接口、Semaphore等)对于解决多线程问题至关重要。 3. 线程竞争资源: 当多个线程尝试同时修改同一资源时,就会发生资源竞争。在JDBC中...

    嵌入式实时操作系统的多线程计算--基于ThreadX和ARM--随书光盘(自己备份)

    Express Logic's ThreadX for Win32 Demo Using Visual C/C++ This demo program is intended for use with the book titled "Real-Time Embedded Multithreading: Using ThreadX and ARM" by Edward L....

    Win32多线程程序设计-候捷

    Win32多线程程序设计 -候捷 part1 Win32多线程程序设计 -候捷 part2 http://download.csdn.net/source/290809 Win32多线程程序设计 -候捷 part3http://download.csdn.net/source/290812

    java多线程设计模式详解(PDF及源码)

    你来用 第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-Per-Message——这个工作交给你了 第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 ...

    MFC多线程编程实例----多线程画线源码

    Windows系统允许设置线程的优先级,更高的优先级线程可能会获得更多的CPU时间片,但过度使用高优先级线程可能导致其他线程饿死,因此需谨慎设置。 7. **调试多线程程序**:由于线程间的并发执行,调试多线程程序...

    (中英文)-POSIX多线程程序设计-Programming with POSIX Threads

    《Programming with POSIX Threads》是David Butenhof撰写的一本经典教程,主要针对Unix/Linux环境下的多线程程序设计。本书深入浅出地介绍了POSIX线程(也称为pthreads)API,是理解并掌握多线程编程的重要参考资料...

    多线程精品资源--高并发-高可靠-高性能three-high-import导入系统-高并发多线程进阶.zip

    8. **设计模式**:在多线程环境中适用的设计模式,如单例模式、工厂模式等。 9. **测试与调试**:如何进行并发测试,以及如何定位和修复并发问题。 通过对这些知识点的学习和实践,你将能够掌握如何在实际项目中...

    linux下的多线程实例--生产者消费者

    1. **生产者消费者模型**:一种用于解决多线程环境中资源分配和同步问题的经典设计模式。其中,“生产者”负责生成数据,“消费者”负责处理这些数据。 2. **多线程编程**:在单个程序中创建多个并发执行路径的技术...

    Java多线程实战精讲-带你一次搞明白Java多线程高并发

    Java多线程实战精讲是Java开发者必备的技能之一,特别是在处理高并发场景时,它的重要性不言而喻。本文将深入探讨Java多线程的相关知识点,帮助你全面理解并掌握这一核心概念。 1. **线程基础** - **线程定义**:...

    C#多线程问题2-简单案例-i++ c#经典案例.pdf

    C#多线程问题2-简单案例-i++经典案例 C#多线程问题2-简单案例-i++经典案例是C#编程语言中多线程编程的经典案例,它展示了多线程资源共享问题的典型解决方案。本案例中,我们将学习如何使用C#语言来解决多线程问题,...

    Java多线程与线程安全实践-基于Http协议的断点续传

    在Java编程领域,多线程和线程安全是至关重要的概念,特别是在开发高效、响应迅速的应用程序时。本文将深入探讨如何在Java中实现多线程,并结合HTTP协议实现断点续传功能,以提高文件下载的效率和用户体验。 首先,...

    java多线程设计模式 (PDF中文版, 附源码)

    第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-Per-Message——这个工作交给你了 第8章 Worker Thread——等到工作来,来了就工作 第9章 Future——先给您这张提货单 第10章 Two-Phase...

    JAVA多线程编程详解-详细操作例子

    ### JAVA多线程编程详解-详细操作例子 #### 一、理解多线程 多线程是一种编程模型,它允许程序中的多个指令流同时运行,每个指令流即为一个线程,它们彼此独立但共享同一进程资源。这种机制极大地提高了程序的并发...

    软件工程中的多线程编程实践.pptx

    - **Read/Write Lock模式**: - 允许多个读线程同时访问资源。 - 写操作时独占资源。 - 适用于读多写少的情况。 **并发编程模式比较** - **Fork-Join vs Worker-Thread**: - **Fork-Join**适合递归任务拆分。...

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    在Java编程领域,多线程和线程安全是至关重要的概念,特别是在开发高效并发应用程序时。本实践项目“Java多线程与线程安全实践-基于Http协议的断点续传”聚焦于如何利用Java实现基于Http协议的文件断点续传功能,这...

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....

    多线程并发下的单例模式-源码

    该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保在多线程并发下的线程安全性。 读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式...

    java多线程设计模式详解

    2. 读写锁(Read-Write Lock)模式:针对多读少写场景优化的同步机制,允许多个读线程同时访问共享资源,但在写入时要求独占访问。 3. 信号量(Semaphore)模式:使用信号量可以控制访问某组资源的线程数量,既可以...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

Global site tag (gtag.js) - Google Analytics