zoukankan      html  css  js  c++  java
  • ReentrantReadWriteLock

    使用ReentrantLock构建简单的读写锁

    package com.dwz.locks;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ReadWriteLockExample {
        private final static ReentrantLock lock = new ReentrantLock();
        private final static List<Long> data = new ArrayList<>();
        
        public static void main(String[] args) throws InterruptedException {
            Thread thread1 = new Thread(ReadWriteLockExample::write);
            thread1.start();
            
            TimeUnit.SECONDS.sleep(1);
            
            Thread thread2 = new Thread(ReadWriteLockExample::read);
            thread2.start();
        }
        
        public static void write() {
            try {
                lock.lock();
                data.add(System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        
        public static void read() {
            try {
                lock.lock();
                data.forEach(System.out::println);
                TimeUnit.SECONDS.sleep(5);
                System.out.println(Thread.currentThread().getName() + "====================");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        
    }

    使用ReentrantReadWriteLock

    package com.dwz.locks;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    /**
     *    使用ReentrantReadWriteLock解决读写安全问题以及同时读不需要加锁问题
     *
     *    write write false
     *    write read  false
     *    read  write false
     *    read  read  true
     */
    public class ReadWriteLockExample2 {
        private final static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        
        private final static Lock readLock = readWriteLock.readLock();
        
        private final static Lock writeLock = readWriteLock.writeLock();
        
        private final static List<Long> data = new ArrayList<>();
        
        public static void main(String[] args) throws InterruptedException {
            Thread thread1 = new Thread(ReadWriteLockExample::read);
            thread1.start();
            
            TimeUnit.SECONDS.sleep(1);
            
            Thread thread2 = new Thread(ReadWriteLockExample::read);
            thread2.start();
        }
        
        public static void write() {
            try {
                writeLock.lock();
                data.add(System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                writeLock.unlock();
            }
        }
        
        public static void read() {
            try {
                readLock.lock();
                data.forEach(System.out::println);
                TimeUnit.SECONDS.sleep(5);
                System.out.println(Thread.currentThread().getName() + "====================");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                readLock.unlock();
            }
        }
    }
  • 相关阅读:
    《JavaScript语言精粹》学习心得
    Linq笔记
    关于缓存
    JS-替换全部全部字符串
    相同数据用分号分割
    单例模式
    es6- ArrayBuffer
    vue常用属性解释。
    装饰者模式
    中介者模式
  • 原文地址:https://www.cnblogs.com/zheaven/p/13360145.html
Copyright © 2011-2022 走看看