多线程27 -- ReentrantLock

Posted 黑土白云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程27 -- ReentrantLock相关的知识,希望对你有一定的参考价值。

1.

技术分享图片
 1 /**
 2  * lock.getHoldCount()方法:只能在当前调用线程内部使用,不能再其他线程中使用
 3  * 那么我可以在m1方法里去调用m2方法,同时m1方法和m2方法都持有lock锁定即可 测试结果holdCount数递增
 4  *
 5  */
 6 public class TestHoldCount {
 7 
 8     //重入锁
 9     private ReentrantLock lock = new ReentrantLock();
10     
11     public void m1(){
12         try {
13             lock.lock();
14             System.out.println("进入m1方法,holdCount数为:" + lock.getHoldCount());
15             
16             //调用m2方法
17             m2();
18             
19         } catch (Exception e) {
20             e.printStackTrace();
21         } finally {
22             lock.unlock();
23         }
24     }
25     
26     public void m2(){
27         try {
28             lock.lock();
29             System.out.println("进入m2方法,holdCount数为:" + lock.getHoldCount());
30         } catch (Exception e) {
31             e.printStackTrace();
32         } finally {
33             lock.unlock();
34         }
35     }
36     
37     
38     public static void main(String[] args) {
39         TestHoldCount thc = new TestHoldCount();
40         thc.m1();
41         /*
42         进入m1方法,holdCount数为:1
43         进入m2方法,holdCount数为:2 */
44     }
45 }
View Code

 2.

技术分享图片
 1 public class UseReentrantLock {
 2     
 3     private Lock lock = new ReentrantLock();
 4     
 5     public void method1(){
 6         try {
 7             lock.lock();
 8             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1..");
 9             Thread.sleep(1000);
10             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1..");
11             Thread.sleep(1000);
12         } catch (InterruptedException e) {
13             e.printStackTrace();
14         } finally {
15             
16             lock.unlock();
17         }
18     }
19     
20     public void method2(){
21         try {
22             lock.lock();
23             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method2..");
24             Thread.sleep(2000);
25             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method2..");
26             Thread.sleep(1000);
27         } catch (InterruptedException e) {
28             e.printStackTrace();
29         } finally {
30             
31             lock.unlock();
32         }
33     }
34     
35     public static void main(String[] args) {
36 
37         final UseReentrantLock ur = new UseReentrantLock();
38         Thread t1 = new Thread(new Runnable() {
39             @Override
40             public void run() {
41                 ur.method1(); //同一把锁 ur
42                 ur.method2(); //同一把锁 ur
43             }
44         }, "t1");
45 
46         t1.start();
47         try {
48             Thread.sleep(10);
49         } catch (InterruptedException e) {
50             e.printStackTrace();
51         }
52         //System.out.println(ur.lock.getQueueLength());
53     }
54     /*
55     当前线程:t1进入method1..
56     当前线程:t1退出method1..
57     当前线程:t1进入method2..
58     当前线程:t1退出method2.. */
59     
60 }
View Code

 

以上是关于多线程27 -- ReentrantLock的主要内容,如果未能解决你的问题,请参考以下文章

java多线程---重入锁ReentrantLock

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

Java多线程和并发,ReentrantLock(公平锁)

多线程-ReentrantLock

多线程编程-- part5.1 互斥锁ReentrantLock

Java多线程通信syncrhoized下wait()/notify()与ReentrantLock下condition的用法比较