多线程相关ReentrantLock

reentrantlock  必须要必须要必须要手动释放锁
使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放
使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待,例如代码
 1 /**
 2      * 使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行
 3      * 可以根据tryLock的返回值来判定是否锁定
 4      * 也可以指定tryLock的时间,由于tryLock(time)抛出异常,所以要注意unclock的处理,必须放到finally中
 5      */
 6     void m2() {
 7         /*
 8         boolean locked = lock.tryLock();
 9         System.out.println("m2 ..." + locked);
10         if(locked) lock.unlock();
11         */
12         
13         boolean locked = false;
14         
15         try {
16             locked = lock.tryLock(5, TimeUnit.SECONDS);
17             System.out.println("m2 ..." + locked);
18         } catch (InterruptedException e) {
19             e.printStackTrace();
20         } finally {
21             if(locked) lock.unlock();
22         }
23         
24     }
使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,在一个线程等待锁的过程中,可以被打断
 1 /**
 2  * reentrantlock用于替代synchronized
 3  * 由于m1锁定this,只有m1执行完毕的时候,m2才能执行
 4  * 这里是复习synchronized最原始的语义
 5  * 
 6  * 使用reentrantlock可以完成同样的功能
 7  * 需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)
 8  * 使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放
 9  * 
10  * 使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待
11  * 
12  * 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,
13  * 在一个线程等待锁的过程中,可以被打断
14  * 
15  * @author mashibing
16  */
17 package com.hamster.concurrent.c020;
18 
19 import java.util.concurrent.TimeUnit;
20 import java.util.concurrent.locks.Lock;
21 import java.util.concurrent.locks.ReentrantLock;
22 
23 public class ReentrantLock4 {
24         
25     public static void main(String[] args) {
26         Lock lock = new ReentrantLock();
27         
28         
29         Thread t1 = new Thread(()->{
30             try {
31                 lock.lock();
32                 System.out.println("t1 start");
33                 TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
34                 System.out.println("t1 end");
35             } catch (InterruptedException e) {
36                 System.out.println("interrupted!");
37             } finally {
38                 lock.unlock();
39             }
40         });
41         t1.start();
42         
43         Thread t2 = new Thread(()->{
44             try {
45                 //lock.lock();
46                 lock.lockInterruptibly(); //可以对interrupt()方法做出响应
47                 System.out.println("t2 start");
48                 TimeUnit.SECONDS.sleep(5);
49                 System.out.println("t2 end");
50             } catch (InterruptedException e) {
51                 System.out.println("interrupted!");
52             } finally {
53                 lock.unlock();
54             }
55         });
56         t2.start();
57         
58         try {
59             TimeUnit.SECONDS.sleep(1);
60         } catch (InterruptedException e) {
61             e.printStackTrace();
62         }
63         t2.interrupt(); //打断线程2的等待
64         //ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException
65     }
66 }

猜你喜欢

转载自www.cnblogs.com/zchok/p/12972243.html