码迷,mamicode.com
首页 > 其他好文 > 详细

Lock->ReentrantLock->ReentrantReadWriteLock简介

时间:2019-11-01 09:52:17      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:接口   一个   https   interface   存在   readwrite   ace   可重入锁   方法   

一、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的替代,ReentrantLock是Java语言层面实现的锁机制,synchronized是JVM层面实现的锁机制

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

 

Lock->ReentrantLock->ReentrantReadWriteLock简介

标签:接口   一个   https   interface   存在   readwrite   ace   可重入锁   方法   

原文地址:https://www.cnblogs.com/june0816/p/11603770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!