重入锁--ReentrantLock

来源:互联网 发布:骚男淘宝外设店网址 编辑:程序博客网 时间:2024/05/01 05:08

1、优势:当许多线程都在争用同一个锁时,使用 ReentrantLock 的总体开支通常要比 synchronized 少得多,同时具有很多 synchronized 没有的新特性。

2、劣势:需要谨记在finally块中释放锁,上几把就解几次。新手很容易忘记,而synchronized不需要手动解锁。【ReentrantLock不是内建锁】,发生异常不会自动释放锁。在ReentrantLock前加final

3、演示代码如下:

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();@Overridepublic 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+" 玩耍结束!");}}



原创粉丝点击