`
jackyhongvip
  • 浏览: 159348 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lock和lockInterruptibly

    博客分类:
  • j2se
 
阅读更多

lockInterruptibly()允许在等待时由其他线程的Thread.interrupt()方法来中断等待线程而直接返回,这时是不用获取锁的,而会抛出一个InterruptException。而ReentrantLock.lock()方法则不允许Thread.interrupt()中断,即使检测到了Thread.interruptted一样会继续尝试获取锁,失败则继续休眠。只是在最后获取锁成功之后在把当前线程置为interrupted状态。

 

public class TestLock {

	public static void main(String[] args) {
		Thread t1 = new Thread(new RunIt());
		Thread t2 = new Thread(new RunIt());
		
		t1.start();
		t2.start();
		t2.interrupt();
		
	}
}

class RunIt implements Runnable{

	private static Lock lock = new ReentrantLock();
	@Override
	public void run() {
		try {
			runJob();
		} catch (InterruptedException e) {
			System.out.println(Thread.currentThread().getName()+" Interrrupted from runJob.");
		}
	}
	
	private void runJob() throws InterruptedException{
		lock.lockInterruptibly();
		System.out.println(Thread.currentThread().getName()+" 到此一游....");
		try{
			System.out.println(Thread.currentThread().getName() + " running");
			TimeUnit.SECONDS.sleep(3);
			System.out.println(Thread.currentThread().getName() + " finished");
			
		}catch(InterruptedException e){
			System.out.println(Thread.currentThread().getName() + " interrupted");
		}finally{
			lock.unlock();
		}
	}
}

 

不管使用lock()还是lockinterruptibly都需要注意不要将该方法置于try块中!

 

分享到:
评论

相关推荐

    java_汇总知识点1

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

    java的lock和synchronized的区别.docx

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

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    java核心知识点整理.pdf

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    java的Lock锁原理详解.docx

    Lock接口提供了比synchronized更丰富的功能,如尝试获取锁(tryLock)、可中断的锁获取(lockInterruptibly)、超时获取锁(tryLock(long time, TimeUnit unit))以及显式解锁(unlock)。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关键字的一种方式出现,提供了更精细的锁...

    Synchronized 和 Lock 的区别和使用场景

    本文将深入探讨两种主要的锁机制:`synchronized`关键字和`Lock`接口,以及它们各自的特点、应用场景和使用方式。 一、Synchronized `synchronized`是Java中的一个内置关键字,用于提供线程安全。它的主要作用是...

    java 锁 Lock接口详解.docx

    `Lock`的`lockInterruptibly()`方法允许线程在等待锁时响应中断。 2. **无法超时**:使用`synchronized`时,线程可能无限期等待锁的释放。`Lock`的`tryLock(long time, TimeUnit unit)`方法允许设置等待时间,超时...

    ArrayBlockingQueue源码解析-动力节点共

    lock.lockInterruptibly(); try { while (count == items.length) notFull.await(); enqueue(e); } finally { lock.unlock(); } } ``` **5. 取出元素(take)** 当队列不为空时,消费者会调用`take`方法...

    JavaLock与Condition的理解Reentran

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

    关于synchronized、Lock的深入理解

    1. **使用方式**:`synchronized`是隐式同步,无需手动释放,而`Lock`是显式同步,需手动调用`lock()`和`unlock()`。 2. **控制能力**:`Lock`提供了更多控制选项,如可中断、可选择公平性、锁分离等。 3. **异常...

    java中Locks的使用详解

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

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

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

    locktest.zip

    3. **可中断性**:Lock的`lockInterruptibly()`方法允许在等待锁时响应中断,而`synchronized`不具备此功能。 4. **尝试获取锁**:`tryLock()`方法允许尝试获取锁,如果无法立即获取,可以选择返回,而不是阻塞。 5....

    JavaMagic:我在哪里进行有关Java新功能的研究

    相比于多线程防止CPU空转Quine 不通过读源文件的方式输出程序源代码本身Vertx 基于netty的NIO实现的小清新WebServer和HttpClientReentrantReadWriteLock的用例以及实现写锁降级为读锁实现三种自旋锁SpinLock直接基于...

Global site tag (gtag.js) - Google Analytics