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多秒
    }
    
  • 相关阅读:
    RestEasy+用户指南----第5章.@PathParam
    RestEasy 用户指南----第4章.使用@Path @GET @POST 等
    Yii2.0----环境搭建
    Vue----创建脚手架项目
    Vue----源码学习-基本实现原理(数据代理、模板编译、数据绑定的实现、双向数据绑定)
    Django框架学习----视图与模板(最新文章实现)
    Django框架学习----视图与模板(分页功能)
    shiro之自定义realm
    shiro之jdbcRealm
    shiro之IniRealm
  • 原文地址:https://www.cnblogs.com/fly-book/p/11400894.html
Copyright © 2011-2022 走看看