• Java多线程-读写锁ReentrantReadWriteLock类


    共享锁 与 排他锁

    ReentrantReadWriteLock类有两个锁,一个是读操作相关的锁,即共享锁。另一个是写操作相关的锁,即排他锁。

    也就是多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。

    读锁与读锁共享

    示例:

    public class Test {
        public static void main(String[] args) {
            Service service = new Service();
            new Thread(() -> service.read(), "A").start();
            new Thread(() -> service.read(), "B").start();
        }
    
        static class Service {
            private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
            public void read() {
                lock.readLock().lock();
                try {
                    System.out.println("线程" + Thread.currentThread().getName() + "获得读锁 " + System.currentTimeMillis());
                    Thread.sleep(2000);
                    System.out.println("线程" + Thread.currentThread().getName() + "读取完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.readLock().unlock();
                }
    
            }
        }
    }

    运行结果如下:

    读锁与写锁互斥

    示例:

    public class Test {
        public static void main(String[] args) {
            Service service = new Service();
            new Thread(() -> service.read(), "A").start();
            new Thread(() -> service.read(), "B").start();
        }
    
        static class Service {
            private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
            public void read() {
                lock.writeLock().lock();
                try {
                    System.out.println("线程" + Thread.currentThread().getName() + "获得写锁 " + System.currentTimeMillis());
                    Thread.sleep(2000);
                    System.out.println("线程" + Thread.currentThread().getName() + "写完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.writeLock().unlock();
                }
    
            }
        }
    }

    运行结果如下:

  • 相关阅读:
    ios可变数组的所有操作
    iOS不可变数组的所有操作
    Android 混淆打包
    Android 给TextView中的字体加上“中间线”
    Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决
    Android Bundle传递对象
    Java java.text.ParseException: Unparseable date
    Android关于LinearLayout和RelativeLayout背景设置的区别
    Android 给CheckBox设置背景
    Android String.xml中的符号总结
  • 原文地址:https://www.cnblogs.com/lkc9/p/12565042.html
Copyright © 2020-2023  润新知