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();
            }
        }
    }
  • 相关阅读:
    selenium(七)expected_conditions EC
    Alpine Linux常用命令
    python logging模块,升级print调试到logging。
    用flask Flask-RESTful,实现RESTful API
    python,判断操作系统是windows,linux
    在docker hub,用github的dockerfile自动生成docker镜像
    解决pycharm问题:module 'pip' has no attribute 'main'
    alpine linux docker 安装 lxml出错的解决办法。
    (转载)服务端技术选型
    maven的pom文件
  • 原文地址:https://www.cnblogs.com/zheaven/p/13360145.html
Copyright © 2011-2022 走看看