`

java Lock 以及lockInterruptibly

阅读更多

Lock接口的 线程请求锁的 几个方法:

lock(), 拿不到lock就不罢休,不然线程就一直block。 比较无赖的做法。
tryLock(),马上返回,拿到lock就返回true,不然返回false。 比较潇洒的做法。
带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false。比较聪明的做法。

下面的lockInterruptibly()就稍微难理解一些。

先说说线程的打扰机制,每个线程都有一个 打扰 标志。这里分两种情况,
1. 线程在sleep或wait,join, 此时如果别的进程调用此进程的 interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;(thread在做IO操作时也可能有类似行为,见java thread api)
2. 此线程在运行中, 则不会收到提醒。但是 此线程的 “打扰标志”会被设置, 可以通过isInterrupted()查看并 作出处理。

lockInterruptibly()和上面的第一种情况是一样的, 线程在请求lock并被阻塞时,如果被interrupt,则“此线程会被唤醒并被要求处理InterruptedException”。

我写了几个test,验证一下:

1). lock()忽视interrupt(), 拿不到锁就 一直阻塞:

  1. @Test
  2. publicvoid test3()throwsException{
  3.     finalLock lock=newReentrantLock();
  4.     lock.lock();
  5.     Thread.sleep(1000);
  6.     Thread t1=newThread(newRunnable(){
  7.         @Override
  8.         publicvoid run(){
  9.             lock.lock();
  10.             System.out.println(Thread.currentThread().getName()+" interrupted.");
  11.         }
  12.     });
  13.     t1.start();
  14.     Thread.sleep(1000);
  15.     t1.interrupt();
  16.     Thread.sleep(1000000);
  17. }
 

可以进一步在Eclipse debug模式下观察,子线程一直阻塞。

2). lockInterruptibly()会响应打扰 并catch到InterruptedException

  1. @Test
  2. publicvoid test4()throwsException{
  3.     finalLock lock=newReentrantLock();
  4.     lock.lock();
  5.     Thread.sleep(1000);
  6.     Thread t1=newThread(newRunnable(){
  7.         @Override
  8.         publicvoid run(){
  9.             try{
  10.                 lock.lockInterruptibly();
  11.             }catch(InterruptedException e){
  12.                         System.out.println(Thread.currentThread().getName()+" interrupted.");
  13.             }
  14.         }
  15.     });
  16.     t1.start();
  17.     Thread.sleep(1000);
  18.     t1.interrupt();
  19.     Thread.sleep(1000000);
  20. }
 

3). 以下实验验证:当线程已经被打扰了(isInterrupted()返回true)。则线程使用lock.lockInterruptibly(),直接会被要求处理InterruptedException。

  1. @Test
  2. publicvoid test5()throwsException{
  3.     finalLock lock=newReentrantLock();
  4.     Thread t1=newThread(newRunnable(){
  5.         @Override
  6.         publicvoid run(){
  7.             try{
  8.                 Thread.sleep(2000);
  9.                 lock.lockInterruptibly();
  10.             }catch(InterruptedException e){
  11.                 System.out.println(Thread.currentThread().getName()+" interrupted.");
  12.             }
  13.         }
  14.     });
  15.     t1.start();
  16.     t1.interrupt();
  17.     Thread.sleep(10000000);
  18. }  
分享到:
评论

相关推荐

    java的Lock锁原理详解.docx

    Lock接口提供了比synchronized更丰富的功能,如尝试获取锁(tryLock)、可中断的锁获取(lockInterruptibly)、超时获取锁(tryLock(long time, TimeUnit unit))以及显式解锁(unlock)。Lock接口的实现类,例如...

    JavaLock与Condition的理解Reentran

    Java Lock与Condition是Java并发编程中的重要概念,它们提供了比synchronized关键字更细粒度的控制,从而使得多线程程序的设计和管理更加灵活高效。本文将深入探讨ReentrantLock(可重入锁)和Condition的基本原理、...

    java的lock和synchronized的区别.docx

    Java 中的 Lock 和 Synchronized 的区别 Java 语言中有很多相似关键字或相似意义的字,但 lock 和 synchronized 是两个最容易混淆的关键字。它们都是锁的意思,都是为了线程安全性、应用合理性和运行效率的。下面...

    java 锁 Lock接口详解.docx

    下面将详细解释`Lock`接口以及与`synchronized`的区别。 `Lock`接口是锁的抽象,它提供了更加灵活和细粒度的控制。`ReentrantLock`是`Lock`接口的主要实现类,支持可重入性,即线程可以多次获取同一锁,只要在每次...

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    2. lockInterruptibly():与lock()类似,但当线程被中断时会抛出InterruptedException。 3. tryLock():尝试获取锁,如果成功则立即返回true,否则返回false,不会阻塞。 4. unlock():释放锁,必须在获取锁后调用,...

    java中的Lock类和Condition类.docx

    Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...

    Java多线程编程之Lock用法实例

    2. `void lockInterruptibly() throws InterruptedException`: 与`lock()`类似,但当线程被中断时会抛出`InterruptedException`,并释放锁,允许线程处理中断请求。 3. `boolean tryLock()`: 尝试获取锁,如果锁可用...

    java中Locks的使用详解

    * void lockInterruptibly() - 和 lock() 很类似,但是它可以将正在阻塞的线程中断,并抛出 java.lang.InterruptedException。 * boolean tryLock() – 这是 lock() 的非阻塞版本,它回尝试获取锁,并立刻返回是否...

    高级Java多线程面试题及回答(合集).docx

    - 可中断:`Lock.lockInterruptibly()`可以让线程在等待锁时响应中断。 - 锁超时:`tryLock(long time, TimeUnit unit)`允许设置等待时间,超过时间则返回。 - 可以实现高级功能,如`Condition`,可以实现线程间...

    java_汇总知识点1

    - Lock、tryLock和lockInterruptibly:Lock接口提供了比synchronized更细粒度的锁控制,tryLock尝试获取锁,lockInterruptibly允许被中断。 5. **并发与JUC**: - JUC(Java Util Concurrency)包包含各种并发...

    Java锁机制详解.pdf

    2. lockInterruptibly():与lock()类似,但它在获得锁的过程中可以响应中断,如果当前线程在等待获取锁的过程中被中断,则会抛出InterruptedException。 3. tryLock():尝试非阻塞地获取锁,如果获取成功则返回true...

    Java线程同步与 Java 并发设施.pdf

    此外,Lock接口还提供了tryLock()方法,允许尝试获取锁而不阻塞,以及lockInterruptibly()方法,允许线程在等待锁时响应中断。 java.util.concurrent.atomic包中的原子类,如AtomicInteger、AtomicLong等,使用了...

    Java多线程程序设计

    3. Lock接口与ReentrantLock类:提供比synchronized更细粒度的锁控制,如公平锁、非公平锁、读写锁等,以及tryLock()尝试获取锁、lockInterruptibly()响应中断等高级功能。 四、线程通信 Java提供了wait(), notify...

    Java concurrency之互斥锁_动力节点Java学院

    9. `lock()`, `lockInterruptibly()`, `tryLock()`, 和 `tryLock(long timeout, TimeUnit unit)`: 不同的锁获取方式,`lockInterruptibly()`允许线程在等待锁时响应中断,`tryLock()`尝试获取锁,存在超时版本。...

    Java concurrency之互斥锁_动力节点Java学院整理

    这与`synchronized`块类似,但`ReentrantLock`提供了更细粒度的控制,如尝试非阻塞获取锁(`tryLock()`)、可中断的锁获取(`lockInterruptibly()`)以及对锁状态的查询方法。 总结来说,`ReentrantLock`是Java并发编程...

    Java并发编程实践-电子书-07章.pdf

    2. **`void lockInterruptibly()` throws `InterruptedException`**:如果当前线程未被中断,则获取锁。如果锁可用,则获取锁并立即返回;如果线程在等待过程中被中断,则抛出`InterruptedException`。 3. **`...

Global site tag (gtag.js) - Google Analytics