java多线程-ReadWriteLock

大纲:

  1. ReadWriteLock接口
  2. ReentrantReadWriteLock
  3. ReentrantReadWriteLock使用

 

一、ReadWriteLock

public interface ReadWriteLock {
    Lock readLock();
    Lock writeLock();
}
  1. readLock获得读锁。
  2. writeLock获得写锁。

二、ReentrantReadWriteLock是ReadWriteLock的实现类

  1. ReentrantReadWriteLock内部维护了两个实现Lock接口的内部类ReadLock读锁,与WriteLock写锁。
  2. 仅写锁支持condition。
  3. 锁降级:写锁降级为读锁,获取写锁、获取读锁、释放写锁。
  4. 锁升级:不支持读锁升级为写锁。
  5. 线程间互斥关系:读读共享锁、读写独享锁、写写独享锁
    public class Met {
        ReadWriteLock lock = new ReentrantReadWriteLock();
        public void read(Thread thread){
            try {
                lock.readLock().lock();
                System.out.println(thread.getName()+"read lock");
                for(int i =0;i<10;i++){ System.out.println(thread.getName()+":"+i); } } finally { System.out.println(Thread.currentThread().getName()+"read unlock"); lock.readLock().unlock(); } } public void write(Thread thread){ try { lock.writeLock().lock(); System.out.println(thread.getName()+"write lock"); for(int i =0;i<10;i++){ System.out.println(thread.getName()+":"+i); } } finally { System.out.println(Thread.currentThread().getName()+"write unlock"); lock.writeLock().unlock(); } } }
    public class ReadRunnable implements Runnable {
        Met met;
        ReadRunnable(Met met){
            this.met = met;
        }
        @Override
        public void run() {
            met.read(Thread.currentThread());
        }
    }
    public class WriteRunnable implements Runnable {
        Met met;
        WriteRunnable(Met met){
            this.met = met;
        }
        @Override
        public void run() {
            met.write(Thread.currentThread());
        }
    }
    class TestReadWrite {
        public static void main(String[] args) {
            Met met = new Met();
            ReadRunnable read = new ReadRunnable(met);
            WriteRunnable write = new WriteRunnable(met);
            Thread threadread0 = new Thread(read); Thread threadread1 = new Thread(read); Thread threadwrite0 = new Thread(write); threadread0.start(); threadread1.start(); threadwrite0.start(); } }

三、ReentrantReadWriteLock使用

  官方demo:更新缓存后的锁降级,保持读锁。

public class CachedData {
    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    String data = "未更新"; //缓存数据
    volatile boolean isValid; //缓存数据是否有效
    void processCachedData(){
        readWriteLock.readLock().lock();
        System.out.println(Thread.currentThread().getName()+"readLock.lock");
        //校验缓存数据是否有效,若无效跟新data,有效直接使用
        if(!isValid){
            System.out.println(Thread.currentThread().getName()+"readLock.unlock");
            readWriteLock.readLock().unlock();
            readWriteLock.writeLock().lock();
            System.out.println(Thread.currentThread().getName()+"writeLock.lock");
            //再次校验
            if(!isValid){
                data = "已更新";
                isValid = true;
                System.out.println(Thread.currentThread().getName()+">>>refresh data");
            }
            //写锁降级为读锁:释放写锁前获取读锁
            readWriteLock.readLock().lock();
            System.out.println(Thread.currentThread().getName()+"readLock.lock");
            System.out.println(Thread.currentThread().getName()+"writeLock.unlock");
            //写锁被释放,读锁依旧
            readWriteLock.writeLock().unlock();
        }
        System.out.println(Thread.currentThread().getName()+">>>use data "+data);
        System.out.println(Thread.currentThread().getName()+"readLock.unlock");
        readWriteLock.readLock().unlock();
    }
}
public class ReadWriteRunnable implements Runnable {
    CachedData task;
    public ReadWriteRunnable(CachedData task){
        this.task = task;
    }
    @Override
    public void run() {
        task.processCachedData();
    }
}
class TestReadWrite {
    public static void main(String[] args) {
        CachedData task = new CachedData();
        ReadWriteRunnable readWriteRunnable = new ReadWriteRunnable(task);
        new Thread(readWriteRunnable).start();
        new Thread(readWriteRunnable).start();
        new Thread(readWriteRunnable).start();
        new Thread(readWriteRunnable).start();
        new Thread(readWriteRunnable).start();
        new Thread(readWriteRunnable).start();
    }
}

 

转载于:https://www.cnblogs.com/liuboyuan/p/10316411.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值