zoukankan      html  css  js  c++  java
  • 22.ReadWriteLock读写锁

    import java.util.Random;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    /**
     * ReadWriteLock读写锁:允许多个线程同时读
     * 读-读不互斥:读写之间不阻塞
     * 读-写互斥:读阻塞写,写阻塞读
     * 写-写互斥:写写阻塞
     */
    public class ReadWriteLockDemo {
        private static Lock lock = new ReentrantLock();
        private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        private static Lock readLock = readWriteLock.readLock();
        private static Lock writeLock = readWriteLock.writeLock();
        private int value;
        //读
        public Object handleRead(Lock lock) throws InterruptedException{
            try {
                lock.lock();
                Thread.sleep(1000);//读操作的耗时越多读写的优势越明显
                return value;
            } finally {
                lock.unlock();
            }
        }
        //写
        public void handleWrite(Lock lock,int index) throws InterruptedException{
            try {
                lock.lock();
                Thread.sleep(1000);
                value = index;
            } finally {
                lock.unlock();
            }
        }
        public static void main(String[] args){
            final ReadWriteLockDemo demo = new ReadWriteLockDemo();
            Runnable readRunnable = () -> {
                try {
                    demo.handleRead(readLock);//读写锁
    //                    demo.handleRead(lock);//重入锁
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            Runnable writeRunnable = () -> {
                try {
                    demo.handleWrite(writeLock,new Random().nextInt());//读写锁
    //                    demo.handleWrite(lock,new Random().nextInt());//重入锁
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            //读写分离
            for (int i = 0; i < 18; i++) {
                new Thread(readRunnable).start();
            }
            for (int i = 18; i < 20; i++) {
                new Thread(writeRunnable).start();
            }
        }
        //使用读写锁,由于使用了读写分离,读线程完全并行,而写会阻塞读(注意for循环次数,写线程之间实际是串行的),因此运行大约2秒多结束
        //而使用重入锁,所有读写线程之间都必须相互等待,因此执行时间大约20多秒
    }
    
  • 相关阅读:
    Hibernate第二天:Hibernate的一级缓存、其他的API
    Hibernate第一天(Hibernate的环境搭建、Hibernate的API、Hibernate的CRUD)
    数据结构基础(一)数组,矩阵
    MyEclipseSVN插件百度云下载
    修改CentOS主机名
    Word中增加仿宋GB-2312字体
    Linux系统常用基本命令总结
    SpringBoot视频教程 百度云
    VM虚拟机中linux centOS 联网单网卡配置教程
    Java正则表达式匹配日期及基本使用
  • 原文地址:https://www.cnblogs.com/fly-book/p/11400894.html
Copyright © 2011-2022 走看看