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

 

posted @ 2019-11-01 09:02  牧云文仔  阅读(118)  评论(0编辑  收藏  举报