IT教程 ·

Java并发编程(三):ReentrantLock

ReentrantLock是能够用来替代synchronized的。ReentrantLock比synchronized越发天真,功用上面越发雄厚,机能方面自synchronized优化后二者机能没有什么太大差异。

说一下二者的区分起首ReetrantLock是基于JDK完成层面的,而synchronized是基于JVM层面完成的。ReentrantLock能够举行tryLock尝试锁定,支撑平正锁的完成。

 

Lock lock = new ReentrantLock(); 
lock.lock();
try {
    //营业逻辑  
} finally {
  lock.unlock();
}

一个ReentrantLock的简朴完成,要注意的是,必需要手动开释锁,不然很轻易发生死锁。运用sync锁定的话碰到非常,jvm会自动开释锁,然则reentrantLock必需手动开释锁,因而经常在finally中举行锁的开释。

 

Lock lock=new ReentrantLock();
    boolean locked=false;
    try{
        try {
            locked=lock.tryLock(5,TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }finally {
        if(locked){
            lock.unlock();
        }
    }

ReentrantLock能够举行tryLock尝试锁定,tryLock的要领就是举行尝试锁定,假如能在指定时间内获得锁,就返回true,反之返回false。指定时间内没法锁定时,线程能够决议是不是继承守候。

 

private static ReentrantLock lock=new ReentrantLock(true); //参数为true示意平正锁

ReentrantLock能够指定为平正锁,ReentrantLock和sync默许黑白平正锁,非平正锁:线程加锁时直接尝试猎取锁,猎取不到就自动到队尾守候。而平正锁:加锁前先检察是不是有列队守候的线程,有的话优先处置惩罚排在前面的线程,先来先得


参与评论