• 技术文章 >java >java基础

    java读写锁的特性

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

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

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

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

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    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学习网