• ReentrantReadWriteLock


    ReentrantReadWriteLock

    ReentrantReadWriteLock:读写锁,在执行读操作时可以异步执行。读-读异步,读-写异步,写-写异步。

    ReentrantLock是完全互斥排他的,效率低;

    ReentrantReadWriteLock有两个锁:

    • 读相关的锁:共享锁

    • 写相关的锁:排他锁

    package ReentranyReadWriteLock;
    ​
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    ​
    //ReentrantReadWriteLock:读读共享、读写互斥
    public class Read_Write {
        public static void main(String[] args) {
            Service service = new Service();
            for(int i=0;i<5;i++){
                new MyThread1(service).start();
                new MyThread2(service).start();
            }
    ​
    ​
        }
    }
    class Service{
        private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
        //读操作
        public void read(){
            try {
                lock.readLock().lock();
                System.out.println("线程:"+Thread.currentThread().getName()
                        +"读......"+System.currentTimeMillis());
                Thread.sleep(500);
                System.out.println("  线程:"+Thread.currentThread().getName()
                        +"读......结束"+System.currentTimeMillis());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.readLock().unlock();
            }
        }
        public void write(){
            try {
                lock.writeLock().lock();
                System.out.println("线程:"+Thread.currentThread().getName()+"写>>>>>>> "
                        +System.currentTimeMillis());
                Thread.sleep(500);
                System.out.println("  线程:"+Thread.currentThread().getName()+"写>>>>>>>结束 "
                        +System.currentTimeMillis());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.writeLock().unlock();
            }
        }
        
    ​
    }
    class MyThread1 extends Thread{
        private Service service;
        public MyThread1(Service service){
            this.service=service;
        }
    ​
        @Override
        public void run() {
            service.read();
        }
    }
    class MyThread2 extends Thread{
        private Service service;
        public MyThread2(Service service){
            this.service=service;
        }
    ​
        @Override
        public void run() {
            service.write();
        }
    }
    /*
    线程:Thread-0读......1609738706403
    线程:Thread-2读......1609738706403
      线程:Thread-0读......结束1609738706918
      线程:Thread-2读......结束1609738706918
    线程:Thread-3写>>>>>>> 1609738706918
      线程:Thread-3写>>>>>>>结束 1609738707434
    线程:Thread-1写>>>>>>> 1609738707434
      线程:Thread-1写>>>>>>>结束 1609738707949
    线程:Thread-5写>>>>>>> 1609738707949
      线程:Thread-5写>>>>>>>结束 1609738708465
    线程:Thread-4读......1609738708465
    线程:Thread-6读......1609738708465
      线程:Thread-6读......结束1609738708981
      线程:Thread-4读......结束1609738708981
    线程:Thread-7写>>>>>>> 1609738708981
      线程:Thread-7写>>>>>>>结束 1609738709481
    线程:Thread-8读......1609738709481
      线程:Thread-8读......结束1609738709996
    线程:Thread-9写>>>>>>> 1609738709996
      线程:Thread-9写>>>>>>>结束 1609738710512
    ​
    ​
     */
  • 相关阅读:
    小埋的Dancing Line之旅:比赛题解&热身题题解
    洛谷P1311 选择客栈
    洛谷 P1039 侦探推理
    洛谷P1140 相似基因
    反⑨baka拖更大队:临时约法
    随机数据生成器
    洛谷P2285 【[HNOI2004]打鼹鼠】
    洛谷P3958 奶酪
    YII 关联查询
    Filter
  • 原文地址:https://www.cnblogs.com/learnjavajava/p/14520439.html
Copyright © 2020-2023  润新知