zoukankan      html  css  js  c++  java
  • java并发初探ReentrantWriteReadLock

    java并发初探ReentrantWriteReadLock

    ReenWriteReadLock类的优秀博客

    ReentrantReadWriteLock读写锁详解
    Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

    ReentrantWriteReadLock类实现

    @startuml
    interface Lock
    interface ReadWriteLock
    class ReentrantReadWriteLock{
    Sync sync
    ReentrantReadWriteLock.ReadLock readerLock;
    ReentrantReadWriteLock.WriteLock writerLock;
    }
    ReadWriteLock <|-- ReentrantReadWriteLock
    ReentrantReadWriteLock --o ReadLock 
    ReentrantReadWriteLock --o WriteLock 
    ReentrantReadWriteLock --o Sync
    AbstractQueuedSynchronizer <|- Sync 
    Lock <|-- ReadLock
    Lock <|-- WriteLock
    @enduml
    

    特点

    ReentrantWriteReadLock内部有读锁和写锁。
    写锁是独占锁
    当前线程持有写锁,其他线程只能等待
    当其他线程拥有对象的写锁或者读锁,当前线程等待获取写锁
    读锁是共享锁
    没有其他线程的写锁,当前线程可以获取读锁

    使用例子

    package com.java.javabase.thread.base.concurrent.lock;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    @Slf4j
    public class ReentranReadWriteLockTest {
        /**
         * @author
         * @version
         * @since
         */
        public static void main(String[] args) {
            ReentranReadWriteLockTest test =new ReentranReadWriteLockTest();
            User user =test.new User("jack",test.new Count("001",1000));
            for(int i=0;i<3;i++)
            {
                user.printCash();
                user.setCash(1000);
            }
        }
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        class Count {
            private String id;
            private int cash;
        }
    
        @Data
        class User {
            private String name;
            private Count count;
            private ReadWriteLock readWriteLock;
    
            public User(String name, Count count) {
                this.name = name;
                this.count = count;
                this.readWriteLock = new ReentrantReadWriteLock();
            }
    
            public void setCash(final int cash) {
                new Thread() {
                    @Override
                    public void run() {
                        readWriteLock.writeLock().lock();
                        try {
                            log.info("thread {} :user {} set  cash {} start",
                                    Thread.currentThread().getName(), name, cash);
                            Thread.sleep(1000);
                            log.info("thread {} :user {} current  cash = {}",
                                    Thread.currentThread().getName(), name, count.getCash());
                            count.setCash(cash);
                            log.info("thread {} :user {} set  cash {} end",
                                    Thread.currentThread().getName(), name, cash);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        finally {
                            readWriteLock.writeLock().unlock();
                        }
                    }
    
                }.start();
    
            }
    
            public void printCash() {
                new Thread() {
                    @Override
                    public void run() {
                        try {
                            readWriteLock.readLock().lock();
                            log.info("thread {} :user {} get  cash start", Thread.currentThread().getName(), name);
                            log.info("thread {} :user {} current  cash = {}",
                                    Thread.currentThread().getName(), name, count.getCash());
                            Thread.sleep(1000);
                            log.info("thread {} :user {} get  cash end", Thread.currentThread().getName(), name);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } finally {
                            readWriteLock.readLock().unlock();
                        }
    
    
                    }
                }.start();
            }
        }
    }
    
    

    例子结果

    2019-08-09 10:49:15,618   [Thread-0] INFO  ReentranReadWriteLockTest  - thread Thread-0 :user jack get  cash start
    2019-08-09 10:49:15,618   [Thread-0] INFO  ReentranReadWriteLockTest  - thread Thread-0 :user jack current  cash = 1000
    2019-08-09 10:49:16,618   [Thread-0] INFO  ReentranReadWriteLockTest  - thread Thread-0 :user jack get  cash end
    2019-08-09 10:49:16,618   [Thread-1] INFO  ReentranReadWriteLockTest  - thread Thread-1 :user jack set  cash 1000 start
    2019-08-09 10:49:17,618   [Thread-1] INFO  ReentranReadWriteLockTest  - thread Thread-1 :user jack current  cash = 1000
    2019-08-09 10:49:17,618   [Thread-1] INFO  ReentranReadWriteLockTest  - thread Thread-1 :user jack set  cash 1000 end
    2019-08-09 10:49:17,618   [Thread-4] INFO  ReentranReadWriteLockTest  - thread Thread-4 :user jack get  cash start
    2019-08-09 10:49:17,618   [Thread-2] INFO  ReentranReadWriteLockTest  - thread Thread-2 :user jack get  cash start
    2019-08-09 10:49:17,618   [Thread-4] INFO  ReentranReadWriteLockTest  - thread Thread-4 :user jack current  cash = 1000
    2019-08-09 10:49:17,618   [Thread-2] INFO  ReentranReadWriteLockTest  - thread Thread-2 :user jack current  cash = 1000
    2019-08-09 10:49:18,618   [Thread-4] INFO  ReentranReadWriteLockTest  - thread Thread-4 :user jack get  cash end
    2019-08-09 10:49:18,618   [Thread-2] INFO  ReentranReadWriteLockTest  - thread Thread-2 :user jack get  cash end
    2019-08-09 10:49:18,618   [Thread-5] INFO  ReentranReadWriteLockTest  - thread Thread-5 :user jack set  cash 1000 start
    2019-08-09 10:49:19,617   [Thread-5] INFO  ReentranReadWriteLockTest  - thread Thread-5 :user jack current  cash = 1000
    2019-08-09 10:49:19,617   [Thread-5] INFO  ReentranReadWriteLockTest  - thread Thread-5 :user jack set  cash 1000 end
    2019-08-09 10:49:19,617   [Thread-3] INFO  ReentranReadWriteLockTest  - thread Thread-3 :user jack set  cash 1000 start
    2019-08-09 10:49:20,617   [Thread-3] INFO  ReentranReadWriteLockTest  - thread Thread-3 :user jack current  cash = 1000
    2019-08-09 10:49:20,617   [Thread-3] INFO  ReentranReadWriteLockTest  - thread Thread-3 :user jack set  cash 1000 end
    
    
  • 相关阅读:
    转dhdhtmlxTree
    转Merge的用法
    解决SqlServer2008评估期过期
    借鉴一下对比算法
    Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
    查看Windows下引起Oracle CPU占用率高的神器-qslice
    今日有奖活动一览
    【分享】给做技术的战友们推荐一个不错的微信公号解解闷
    Unreal Engine Plugin management
    当在ECLIPSE中import现存项目时,如遇到版本不符
  • 原文地址:https://www.cnblogs.com/JuncaiF/p/11326190.html
Copyright © 2011-2022 走看看