zoukankan      html  css  js  c++  java
  • 使用StampedLock替代ReentrantReadWriteLock

    悲观读(写的机会很少)

    package com.dwz.stampedLock;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Optional;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.StampedLock;
    import java.util.stream.Collectors;
    
    /**
     *     悲观读(写的机会很少)
     *    100 threads
     *    99  threads need read lock
     *    1    threads need write lock
     *    可以使用StampedLock替代ReentrantReadWriteLock
     */
    public class StampedLockExample {
        private final static StampedLock lock = new StampedLock();
        
        private final static List<Long> DATA = new ArrayList<>();
        
        private static void read() {
            long stamped = -1;
            try {
                stamped = lock.readLock();
                Optional.of(DATA.stream().map(String::valueOf).collect(Collectors.joining("#", "R-", "")))
                        .ifPresent(System.out::println);
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlockRead(stamped);
            }
        }
        
        private static void write() {
            long stamped = -1;
            try {
                stamped = lock.writeLock();
                DATA.add(System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlockWrite(stamped);
            }
        }
        
        public static void main(String[] args) {
            final ExecutorService executor = Executors.newFixedThreadPool(10);
            Runnable readTask = () -> {
                for(;;) {
                    read();
                }
            };
            
            Runnable writeTask = () -> {
                for(;;) {
                    write();
                }
            };
            
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(writeTask);
        }
    }

    改进

    package com.dwz.stampedLock;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Optional;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.StampedLock;
    import java.util.stream.Collectors;
    /**
     *    乐观读(写的机会相对增多)
     */
    public class StampedLockExample2 {
        private final static StampedLock lock = new StampedLock();
        
        private final static List<Long> DATA = new ArrayList<>();
        
        private static void read() {
            long stamp = lock.tryOptimisticRead();
            if(lock.validate(stamp)) {//验证在该时间锁是否还持有
                try {
                    stamp = lock.readLock();
                    Optional.of(DATA.stream().map(String::valueOf).collect(Collectors.joining("#", "R-", "")))
                            .ifPresent(System.out::println);
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlockRead(stamp);
                }
            }
        }
        
        private static void write() {
            long stamped = -1;
            try {
                stamped = lock.writeLock();
                DATA.add(System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlockWrite(stamped);
            }
        }
        
        public static void main(String[] args) {
            final ExecutorService executor = Executors.newFixedThreadPool(10);
            Runnable readTask = () -> {
                for(;;) {
                    read();
                }
            };
            
            Runnable writeTask = () -> {
                for(;;) {
                    write();
                }
            };
            
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(readTask);
            executor.submit(writeTask);
        }
    }
  • 相关阅读:
    Symbian点滴3对象的创建和释放以及对象的二阶段构造
    SQL 列转行
    HashMap详解
    SpringCloudEureka工作原理及和ZooKeeper的区别
    Redis如何使redis中存放数据都为热点数据,缓存算法,key的淘汰策略
    线程的三种实现方式详解
    Redis缓存雪崩,缓存穿透,缓存击穿,缓存预热概念及解决方案
    mysql系列——连接查询(七)
    SpringCloud服务雪崩,降级 ,熔断
    hdu 2215 Maple trees
  • 原文地址:https://www.cnblogs.com/zheaven/p/13396177.html
Copyright © 2011-2022 走看看