`
bo_hai
  • 浏览: 565807 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

lockInterruptibly 和lock的区别

 
阅读更多

这是个被无数人写过并还会被其他人继续写下去的blog。

代码如下:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TestLock {

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

class RunTt3 implements Runnable {

	private static Lock lock = new ReentrantLock();
	
	@Override
	public void run() {
		try {
			lock.lock();
			System.out.println(Thread.currentThread().getName() + " running");  
            TimeUnit.SECONDS.sleep(5);  
            System.out.println(Thread.currentThread().getName() + " finished"); 
		} catch(InterruptedException e) {
			System.out.println(Thread.currentThread().getName() + " interrupted");  
		} finally {
			lock.unlock();
		}
	}
}

 执行结果如下:

 

(1):

 

Thread-1 running
Thread-1 interrupted
Thread-0 running
Thread-0 finished

 (2):

 

 

Thread-0 running
Thread-0 finished
Thread-1 running
Thread-1 interrupted

 总结:
1、线程的执行是无序的,及线程的执行顺序不是按照线程的提交顺序来执行。上述代码中,t1的线程可以先执行;
2、使用显示式锁(ReentrantLock),一定要在finally代码块中释放锁;

 

 

当代码:

lock.lock();

 修改成:

lock.lockInterruptibly();

 执行结果如下:

Exception in thread "Thread-1" Thread-0 running
Thread-1 interrupted
java.lang.IllegalMonitorStateException
	at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260)
	at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:460)
	at com.bohaisoft.concurrent.RunTt3.run(TestLock.java:33)
	at java.lang.Thread.run(Thread.java:745)
Thread-0 finished

 总结:

2、使用lockInterruptibly需要记住:当前线程可以被其他线程中止,并且在其他线程中抛出异常信息;
3、使用lock需要记住:当前线程也可以被其他线程中止,但不会抛出异常信息;

 

来自其他网站上的总结:

ReentrantLock获取锁定与三种方式:
a)lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
b)tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
c)tryLock(long timeout,TimeUnit unit),   如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
d)lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断;

 

我的总结:

synchronized 与 Lock的区别主要表现在:
1、lock支持可判定是否能获取锁的操作,如果不能获取锁,则可以补尝处理,避免等待;
2、lock支持设置等待时间,避免无限制等待;
3、lock支持其他线程中止真在运行的线程;

分享到:
评论
1 楼 bo_hai 2014-09-03  
当要使用可轮询的(tryLock)、可定时的、可中断的锁时,可以考虑ReentrantLock。

相关推荐

    java的lock和synchronized的区别.docx

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

    Synchronized 和 Lock 的区别和使用场景

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

    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关键字的一种方式出现,提供了更精细的锁...

    java 锁 Lock接口详解.docx

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

    JavaLock与Condition的理解Reentran

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

    java中Locks的使用详解

    Lock 和 Synchronized Block 的区别 在之前的文章中,我们讲到了使用 Synchronized Block 来实现 Java 的同步。但是,为什么会引入新的 Lock 呢?主要有以下几点区别: * Synchronized Block 只能写在一个方法里面...

    关于synchronized、Lock的深入理解

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

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

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

    详谈Lock与synchronized 的区别

    然而,它们在特性和使用上存在显著的区别。 首先,Lock是一个接口,它提供了比synchronized更细粒度的控制。synchronized是Java语言的关键字,它的使用更为简单,但灵活性较低。Lock接口由Java并发包java.util....

    java_汇总知识点1

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

    locktest.zip

    本案例"locktest.zip"主要探讨了线程安全中的Lock机制,以及它与synchronized关键字的区别,并通过实例展示了Lock如何实现线程的等待通知和顺序执行。 首先,让我们理解什么是Lock。在Java中,`java.util....

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

    本章着重于展示如何使用显示锁(也称为高级锁),并详细介绍了Lock和ReentrantLock接口以及它们在并发控制中的应用。以下是基于章节标题和部分描述的关键知识点: ### 1. Lock和ReentrantLock #### 1.1 锁接口...

    笔记-4、显式锁和AQS1

    2. **中断性**:synchronized无法中断正在等待锁的线程,而Lock接口提供了`lockInterruptibly()`方法,允许外部中断正在等待锁的线程,增加了灵活性。 3. **超时等待**:Lock接口提供了`tryLock(long timeout, ...

    04 并发编程专题07.zip

    与synchronized不同,Lock可以实现尝试获取锁(tryLock())和可中断的锁等待(lockInterruptibly()),这对于复杂并发控制和异常处理提供了更大的灵活性。 再深入一点,AbstractQueuedSynchronizer(AQS)是Java并...

Global site tag (gtag.js) - Google Analytics