Read-Write lock 看可以,不过看的时候不能写

本文通过一个具体的Java程序示例,介绍了读写锁的工作原理及其应用场景。读写锁允许多个读取者同时访问资源,但写入者必须独占资源,以确保数据一致性。文章中的代码实现了多个读取线程和一个写入线程的竞争情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当线程“读取”实例的状态时,实例的状态不会改变,只有线程对实例“写入”操作时才会改变。read-write lock 模式将读取和写入分开来处理,在读取数据前获取读锁定,而写入之前,必须获取写锁定。 

 

复制代码
public class ReadWriteThreadTest {
    public static void main(String[] args) {
        Data data = new Data(5);
        new ReaderThread(data).start();
        new ReaderThread(data).start();
        new ReaderThread(data).start();
        new ReaderThread(data).start();
        
        new WriterThread(data, "asdfghjk").start();
    }
}

class Data {
    private final char[] buffer;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    Lock read = lock.readLock();
    Lock write = lock.writeLock();

    public Data(int size) {
        this.buffer = new char[size];

        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = '*';
        }
    }

    public char[] read() {
        read.lock();
        try {
            return doRead();
        } finally {
            read.unlock();
        }
    }

    public void write(char c) {
        write.lock();
        try {
            doWrite(c);
        } finally {
            write.unlock();
        }
    }

    private void doWrite(char c) {
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = c;

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

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

        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return newbuf;
    }
}

class WriterThread extends Thread {
    private static final Random random = new Random();
    private final Data data;
    private final String filter;

    private int index;

    public WriterThread(Data data, String filter) {
        this.index = 0;
        this.data = data;
        this.filter = filter;
    }

    @Override
    public void run() {
        try {
            while (true) {
                char c = nextchar();
                data.write(c);
                Thread.sleep(random.nextInt(3000));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private char nextchar() {
        char c = filter.charAt(index);
        index++;
        if (index >= filter.length()) {
            index = 0;
        }
        return c;
    }
}

class ReaderThread extends Thread{
    private final Data data;
    
    public ReaderThread(Data data) {
        this.data=data;
    }

    @Override
    public void run() {
        while(true){
            char[] readbuf = data.read();
            System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf));
        }
    }
}
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值