读写锁 个人笔记--用ReentrantLock和Condition模拟读写锁

博客给出了锁与读写锁相关的例子,涉及信息技术领域中锁机制的实际应用展示。

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

例子:

package com.example.demo.LockTest;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @program: Client
 * @description: 自定义读写锁测试
 * @author: wavesen.shen
 * @create: 2019-06-17 09:09
 */
public class CustomizeReadWriteTest {
    public static CustomizeReadWrite_2 crw=new CustomizeReadWrite_2();
    public static void main(String[] args) throws InterruptedException {
        for (int i=0; i<5; i++) {
            new WriteThread("WriteThread:"+ " "+i+"-", i).start();
        }
        for (int i=0; i<15; i++) {
            new ReadThread("ReadThread:" + " "+i+"-", i).start();
        }
        for (int i=5; i<8; i++) {
            new WriteThread("WriteThread:"+ " "+i+"-", i).start();
        }
        for (int i=15; i<20; i++) {
            new ReadThread("ReadThread:" + " "+i+"-", i).start();
        }
    }
    static class ReadThread extends Thread{
        private int num;
        public ReadThread(String name, int num){
            super(name);
            this.num=num;
        }
        public void run(){
            try{
                crw.lockRead();
            }catch (InterruptedException e){
                e.printStackTrace();
            }finally {
                crw.unLockRead();
            }
        }
    }
    static class WriteThread extends Thread{
        private int num;
        public WriteThread(String name, int num){
            super(name);
            this.num=num;
        }
        public void run(){
            try {
                crw.lockWrite();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                crw.unLockWrite();
            }
        }
    }
}


 class CustomizeReadWrite_2 {
    //读写锁分共享锁和互斥锁(排它锁、独占锁)
    private volatile int readLockNum=0;
    private volatile int writeLockNum=0;
    private Lock lock=new ReentrantLock();
    private Condition readwriteCondition=lock.newCondition();
    public CustomizeReadWrite_2(){}
    //读锁
    public void lockRead() throws InterruptedException {
        while(writeLockNum>0){//有写锁存在
            lock.lock();
            readwriteCondition.await();//进入等待状态
            lock.unlock();
        }
        readLockNum++;//读锁+1
        System.out.println(Thread.currentThread().getName()+": readLock+1,            cunrrentreadNum:"+readLockNum+"      cunrrentwriteNum: "+writeLockNum);
        Thread.sleep(10000);
        System.out.println(Thread.currentThread().getName()+" 执行结束");
    }
    //写锁
    public void lockWrite() throws InterruptedException {
        lock.lock();
        try{
            while(writeLockNum>0){//有写锁存在
                readwriteCondition.await();
            }
            writeLockNum++;
            while(readLockNum>0){//有读锁存在
                readwriteCondition.await();
            }
            System.out.println(Thread.currentThread().getName()+": writeLock+1,        cunrrentreadNum:"+readLockNum+"      cunrrentwriteNum: "+writeLockNum);
            Thread.sleep(1000);//模拟耗时
            System.out.println(Thread.currentThread().getName()+" 执行结束");
        }finally {
            lock.unlock();
        }
    }
    //释放读锁
    public void unLockRead(){
        readLockNum--;
        if(readLockNum<=0){
            lock.lock();
            readwriteCondition.signalAll();
            lock.unlock();
        }
    }
    //释放写锁
    public void unLockWrite(){
        writeLockNum--;
        if(writeLockNum<=0){
            lock.lock();
            readwriteCondition.signalAll();
            lock.unlock();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值