`

ReadWriteLock(一)

阅读更多
线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。

要实现以上的ReadWriteLock,简单的使用synchronized就不行,我们必须自己设计一个ReadWriteLock类,在读之前,必须先获得“读锁”,写之前,必须先获得“写锁”。举例说明:

DataHandler对象保存了一个可读写的char[]数组:

package com.crackj2ee.thread;

public class DataHandler {
    // store data:
    private char[] buffer = "AAAAAAAAAA".toCharArray();

    private char[] doRead() {
        char[] ret = new char[buffer.length];
        for(int i=0; i<buffer.length; i++) {
            ret[i] = buffer[i];
            sleep(3);
        }
        return ret;
    }

    private void doWrite(char[] data) {
        if(data!=null) {
            buffer = new char[data.length];
            for(int i=0; i<buffer.length; i++) {
                buffer[i] = data[i];
                sleep(10);
            }
        }
    }

    private void sleep(int ms) {
        try {
            Thread.sleep(ms);
        }
        catch(InterruptedException ie) {}
    }
}

doRead()和doWrite()方法是非线程安全的读写方法。为了演示,加入了sleep(),并设置读的速度大约是写的3倍,这符合通常的情况。

为了让多线程能安全读写,我们设计了一个ReadWriteLock:

package com.crackj2ee.thread;
public class ReadWriteLock {
    private int readingThreads = 0;
    private int writingThreads = 0;
    private int waitingThreads = 0; // waiting for write
    private boolean preferWrite = true;

    public synchronized void readLock() throws InterruptedException {
        while(writingThreads>0 || (preferWrite && waitingThreads>0))
            this.wait();
        readingThreads++;
    }

    public synchronized void readUnlock() {
        readingThreads--;
        preferWrite = true;
        notifyAll();
    }

    public synchronized void writeLock() throws InterruptedException {
        waitingThreads++;
        try {
            while(readingThreads>0 || writingThreads>0)
                this.wait();
        }
        finally {
            waitingThreads--;
        }
        writingThreads++;
    }

    public synchronized void writeUnlock() {
        writingThreads--;
        preferWrite = false;
        notifyAll();
    }
}

分享到:
评论

相关推荐

    ReadWriteLock

    读写锁(ReadWriteLock)是多线程编程中一种重要的同步机制,主要用于提高并发性能。在Windows环境下,C++可以通过自定义实现或者使用系统提供的API来创建读写锁。在这个项目中,`ReadWriteLock.cpp` 和 `...

    ReadWriteLock的使用

    ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。

    Java中的ReadWriteLock:深入解析与应用实践

    在Java的并发编程中,ReadWriteLock 是一个非常重要的接口,它允许多个线程同时读共享数据,而写操作则是互斥的。这种锁机制特别适合于读多写少的场景,可以显著提高程序的性能和吞吐量。本文将详细介绍 ...

    23 按需上锁—ReadWriteLock详解.pdf

    《Java并发编程学习宝典(漫画版)》中提到的23章主要讲解了Java并发编程中的一个重要概念——ReadWriteLock,即读写锁。ReadWriteLock是`java.util.concurrent.locks`包下的一个接口,它是对传统互斥锁的一个扩展,...

    homework-ReadWriteLock-KristampsW-main.zip

    读写锁是一种多线程同步机制,用于提高并发性能,特别是在读操作远多于写操作的情景下。在Java中,`java.util.concurrent.locks.ReadWriteLock`接口提供了这种功能,它有两个主要的方法:`readLock()` 和 `writeLock...

    Java语言ReadWriteLock特性实例测试

    Java中的ReadWriteLock接口是Java并发包`java.util.concurrent.locks`中的一个重要组件,它提供了比单个锁更复杂的锁定机制。ReadWriteLock接口定义了两个锁:ReadLock(读锁)和WriteLock(写锁)。这种设计允许多...

    ReadWriteLock接口及其实现ReentrantReadWriteLock方法

    ReadWriteLock 接口是 Java 中的一种锁机制,用于解决读写锁的问题。它定义了两个方法:readLock() 和 writeLock(),分别用于获取读锁和写锁。这个接口的主要作用是允许多个线程同时读取资源,但写操作需要独占资源...

    Java多线程之readwritelock读写分离的实现代码

    以下是一个使用ReadWriteLock实现读写分离的例子: ```java package com.bird.concursey.charpet3; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock...

    readwritelock.zip

    在多线程编程中,读写锁(ReadWriteLock)是一种高效且灵活的同步机制,它允许多个线程同时读取共享资源,但在写入时只允许一个线程操作。Java的并发包`java.util.concurrent.locks`中提供了`ReentrantReadWriteLock...

    Java多线程编程之读写锁ReadWriteLock用法实例

    Java的多线程编程中,读写锁(ReadWriteLock)是一种高效的并发控制机制,它将锁的权限进行了区分,允许多个线程同时读取资源,但仅允许一个线程进行写入操作。这种设计模式提高了数据共享的效率,因为读操作通常...

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    - **读写锁**: 除了ReentrantLock,Java还提供了ReadWriteLock接口,它包含两个Lock对象:一个用于读操作(ReadLock),允许多个线程同时读取共享资源;另一个用于写操作(WriteLock),一次只允许一个线程写入。...

    panda-demo.zip

    在“panda-demo”项目中,作者可能创建了两个版本的代码,一个使用synchronized,另一个使用ReadWriteLock。然后通过性能测试(如JMH),对比它们在处理大量并发读写操作时的性能差异。通常,如果读操作远多于写操作...

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    使用 ForkJoinPool 进行分叉和合并,锁 Lock,读写锁 ReadWriteLock 原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关...

    JUC最详细思维导图,一次了解读写锁,可重入锁,Cas原理,volatile 关键字原理

    在JUC中,`java.util.concurrent.locks.ReadWriteLock`接口定义了读写锁,而`ReentrantReadWriteLock`是其具体实现,它支持可重入特性,意味着持有读锁的线程可以再次获取读锁,持有写锁的线程可以获取读锁或写锁。...

    线程同步的一个小程序

    在Java中,`java.util.concurrent.locks.ReadWriteLock`接口定义了读写锁,`ReentrantReadWriteLock`类实现了这一接口。 6. **CountDownLatch**:这是一个计数器,可以用于让一个线程等待其他线程完成操作。在初始...

    层次业务模型的同步锁设计

    在IT行业中,尤其是在软件开发领域,同步锁设计是多线程编程中的一个重要概念,用于确保在并发环境下数据的一致性和完整性。"层次业务模型的同步锁设计"这一主题聚焦于如何在复杂的业务逻辑中,利用同步机制来管理...

    关于读写锁算法的Java实现及思考

    在现代软件开发中,尤其是并发编程领域,读写锁(ReadWriteLock)是一种非常重要的同步工具,它允许多个线程同时进行读操作,但只允许一个线程进行写操作,从而在保证数据一致性的同时,提高了系统的并发性能。...

    操作系统课程设计——读者写者问题

    在操作系统课程设计中,常常会涉及到多线程同步与互斥的问题,其中"读者写者问题"是一个经典的并发控制问题,旨在解决多个读者和一个写者如何共享同一数据资源,确保数据的一致性。 读者写者问题是这样设定的:多个...

Global site tag (gtag.js) - Google Analytics