芳草集谈天说地多线程java

ReentranLock底层原理分析

2019-09-26  本文已影响0人  降龙_伏虎

1 J.U.C简介

2 Lock的基本使用

3 ReentranLock重入锁

public class ThreadDemo1 {

    public synchronized void func1(){//获取对象锁
        System.out.println("func1");
        func2();
    }

    public void func2(){
        synchronized (this){//同一线程,同一把锁允许重入,增加重入次数,并没有死锁
            System.out.println("func2");
        }//同步代码执行完成,减少重入次数
    }

    public static void main(String[] args) {
        ThreadDemo1 demo1 = new ThreadDemo1();
        demo1.func1();
    }
}

public class ThreadDemo2 {
    //重入锁
    static Lock LOCK = new  ReentrantLock();
    
    public void func1(){
        LOCK.lock();//获得重如锁
        //....
        LOCK.unlock();//释放重入锁
    }
}

4 读写锁ReentrantReadWriteLock

public class ThreadDemo3 {
    //读写锁
    static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

    //读锁
    static  ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
    //写锁
    static  ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
    //缓存
    static Map<String,Object> cache = new HashMap<String, Object>();

    /**
     * Description:根据key从缓存中获取对象
     * @Param [key]
     * @return java.lang.Object
    **/

    public final Object getFromCache(String key){
        readLock.lock();//获取'读锁'
        try {
            return cache.get(key);
        } finally {
            readLock.unlock();//释放'读锁'
        }
    }

    /**
     * Description:向缓存中添加对象
     * @Param [key, value]
     * @return void
    **/

    public void putToCache(String key,final Object value){
        writeLock.lock();//获取'写锁'
        try {
            cache.put(key,value);
        } finally {
            writeLock.unlock();//释放'写锁'
        }
    }
}

5 AQS原理分析

ReentrantLock.Sync(内部类).lock()
Sync有两个子类
FairSync-公平锁(不允许插队)
NonfairSync-非公平锁(允许插队)
分别重写了lock()方法

6 AQS源码分析

6.1 ReentrantLock 获取锁LOCK.lock();//获得重入锁时序图

image.png

6.1 ReentrantLock 获取锁LOCK.lock();//获得重入锁流程图

image.png
上一篇 下一篇

猜你喜欢

热点阅读