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();
            }
        }
    }
  • 相关阅读:
    python中函数部分简介与定义(二)
    python中函数部分简介与定义(一)
    db2 不允许在自动存储器表空间上执行 SET TABLESPACE CONTAINERS 命令。的解决办法
    JQuery中$.ajax()方法参数详解
    jquery post 同步异步总结
    js设置height随窗口大小改变
    关于POI的系统整理
    POI 实现导出excel表
    转载>>JQuery EasyUI datagrid 合并表头处理
    iframe标签用法详解(属性、透明、自适应高度)
  • 原文地址:https://www.cnblogs.com/zheaven/p/13360145.html
Copyright © 2011-2022 走看看