1、优势:当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多,同时具有很多 synchronized 没有的新特性。
2、劣势:需要谨记在finally块中释放锁,上几把就解几次。新手很容易忘记,而synchronized不需要手动解锁。【ReentrantLock不是内建锁】,发生异常不会自动释放锁。在ReentrantLock前加final3、演示代码如下:
package reentraceLock2;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
* 优势:1、当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多。
* 2、具有很多 synchronized 没有的新特性。
* 劣势:需要谨记在finally块中释放锁,上几把就解几次。新手很容易忘记,而synchronized不需要手动解锁。
* 【ReentrantLock不是内建锁】,发生异常不会自动释放锁。在ReentrantLock前加final
* @author tiger
* @Date 2017年7月27日
*/
public class ParkTest {
public static void main(String[] args) {
Task task = new Task();
Thread th1 = new Thread(task,"老虎");
Thread th2 = new Thread(task,"蓝猫");
th1.start();
th2.start();
}
}
/**
* 定义一个任务执行体,线程类。
* @author tiger
* @Date 2017年7月27日
*/
class Task implements Runnable{
Park park = new Park();
@Override
public void run() {
park.doLock();
}
}
/**
* 公园类,另外个人(线程)等待带公园(临界区)里的人(线程)出来(释放锁)后,才能进入。
* 如果加了多把锁,只要有一把锁没有释放,则都不能进入。
* @author tiger
* @Date 2017年7月27日
*/
class Park{
//【ReentrantLock不是内建锁】,发生异常不会自动释放锁.要在finally里释放锁,保证程序挂掉后锁可以被释放
final ReentrantLock lock = new ReentrantLock();
public void doLock(){
String name = Thread.currentThread().getName();
String line = null;
System.out.println(name+ " 来到公园(临界区)门口。" );
lock.lock();
// synchronized ("1") {//JVM内置的同步锁,发生异常,锁会自动释放。
try {
System.out.println( name+" 进入公园(临界区)中,需要一张门票可以进。");
lock.lock();
System.out.println( name+" 进入园中园(临界区)中,要另外一张门票才可以进。");
TimeUnit.SECONDS.sleep(2);
// System.out.println(line.length());//会出现空指针异常
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//解开第一把锁
lock.unlock();//保证锁可以被释放
//解开第二把锁
lock.unlock();
}
// }
System.out.println( name+" 玩耍结束!");
}
}