• 技术文章 >java >java基础

    java读写锁的特性

    小妮浅浅小妮浅浅2021-10-20 10:55:45原创4921

    1、公平选择性,支持非公平和公平锁获取,吞吐量不公平优于公平。

    2、重进入,读锁和写锁都支持线程重进入。

    3、锁降级,遵循获取写锁、获取读锁、释放写锁的顺序,写锁可以降级为读锁。

    实例

    public class ReadWriteLockTest {
        public static void main(String[] args) {
     
            final Queue q = new Queue();
     
            for (int i = 0; i < 3; i++) {
     
                new Thread() {
                    @Override
                    public void run() {
     
                        while (true) {
                            q.get();
                        }
                    }
                }.start();
     
                new Thread() {
                    @Override
                    public void run() {
                        while (true) {
                            q.put(new Random().nextInt(10000));
                        }
                    }
                }.start();
            }
        }
    }
     
    class Queue {
     
        //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
        ReadWriteLock rwl = new ReentrantReadWriteLock();
        private Object data = null;//共享数据,只能有一个线程能写数据,但可以有多个线程读该数据
     
        public void get() {
            //上读锁,其他线程只能读不能写
            rwl.readLock().lock();
            try {
     
                System.out.println(Thread.currentThread().getName() + " be ready to read data!");
                Thread.sleep((long) (Math.random() * 1000));
                System.out.println(Thread.currentThread().getName() + " have read data :" + data);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                rwl.readLock().unlock();
            }
        }
     
        public void put(Object data) {
            //上写锁,不允许其他线程读也不允许写
            rwl.writeLock().lock();
     
            try {
                System.out.println(Thread.currentThread().getName() + " be ready to write data!");
     
                Thread.sleep((long) (Math.random() * 1000));
     
                this.data = data;
                System.out.println(Thread.currentThread().getName() + " have write data: " + data);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                rwl.writeLock().unlock();
            }
        }
    }

    以上就是java读写锁的特性,希望对大家有所帮助。更多Java学习指路:Java基础

    专题推荐:java 读写锁
    品易云
    上一篇:java线程执行的两种情况 下一篇:java读写锁是什么

    相关文章推荐

    • java变量的初始化• java类常量是什么• java强制类型转换的使用• java自增和自减运算符的介绍• java拼接字符串的使用• java中空串是什么• java方法的返回值介绍• java静态方法和实例方法的区别• java中hashCode()是什么• java中transient是什么• java阻塞队列的两种操作• java队列抛出异常的介绍• java线程执行的两种情况

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网