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多秒
    }
    
  • 相关阅读:
    HTML5/CSS3滑块动画菜单
    基于HTML5手机登录注册表单代码
    基于HTML5手机上下滑动翻页特效
    基于jQuery+HTML5页面整屏滑动切换代码
    基于html5可拖拽图片循环滚动切换
    基于html5背景图片自适应代码是一款背景不随滚动条滚动,会根据分辨率不同自动匹配对应的背景图片
    HTML5实现摇一摇
    html5桌面通知,notification的使用,右下角出现通知框
    html5全局属性
    HTML5 QQ登录背景动态图片
  • 原文地址:https://www.cnblogs.com/fly-book/p/11400894.html
Copyright © 2011-2022 走看看