zoukankan      html  css  js  c++  java
  • Lock->ReentrantLock->ReentrantReadWriteLock简介

    一、Java2种加锁机制

    1. synchronized关键字,JVM实现字节码指令monitorenter/monitorexit

    2. Lock接口,Java语言层面实现

    二、Lock接口

    1. Java5之后,JDK新增了Lock接口,实现锁的功能,与synchronized关键字类似

    2. 源码

    public interface Lock {
    
        void lock(); //获取锁
    
        void lockInterruptibly() throws InterruptedException;
    
        boolean tryLock();
    
        boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    
        void unlock(); // 释放锁
    
        Condition newCondition();
    }

    三、ReentrantLock

    1. 实现了Lock接口

    2. 是synchronized的替代

    3. 可重入锁:如果线程已经获取了锁,还能再获取一次,计数器加1;释放的时候,要释放两次,等计数器为0的时候,才真正释放

    4. 公平锁:当一个线程释放锁之后,等待时间最长的线程会获得锁

    5. 非公平锁:当一个线程释放锁之后,所有线程一起竞争锁,等待时间最长的线程不一定能获得锁

    6. ReentrantLock默认的构造方法是非公平锁,但可以指定公平锁,

    pubic ReentrantLock(){
           sync = new NofairSync();//默认的构造方法是非公平锁
    } 
    
    public ReentrantLock(boolean fair) {
             sync = fair ? new FairSync() : new NonfairSync();//通过传入boolean类型的值确定到底是公平锁还是非公平锁
    }

    7. lock.lock()方法加锁,lock.unlock()方法释放锁,如果忘记释放,会死锁

    四、ReentrantReadWriteLock读写锁

    1. 自旋锁:当一个线程尝试获取锁,但是没有获取到时,会循环获取

    2. 读写锁是一种特殊的自旋锁,把对共享资源的访问,分成了读锁和写锁

    3. 适合读操作远远大于写操作的情况

    4. 可以同时存在多个读锁

    5. 同一时间只能有一个写锁

    6. 读锁和写锁不能同时存在

    7. 与ReentrantLock相比,多了ReadLock和WriteLock

    参考: 

    https://www.jianshu.com/p/4358b1466ec9

    https://www.cnblogs.com/wait-pigblog/p/9347023.html

    https://www.cnblogs.com/wait-pigblog/p/9350569.html

  • 相关阅读:
    Redis Hashes 巧用sort排序
    Redis 压缩存储的配置
    计算
    关于时间大小判断的坑和网上工具类的看法
    Mysql中字段类型之时间戳大坑2
    Mysql中字段类型之时间戳大坑
    Spring和springmvc父子容器注解扫描问题详解
    JXL导出Excel工具类
    Maven学习
    MySQL之账户管理
  • 原文地址:https://www.cnblogs.com/june0816/p/11603770.html
Copyright © 2011-2022 走看看