`
bo_hai
  • 浏览: 554174 次
  • 性别: 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。

相关推荐

    redisson lock和tryLock 分布式锁简单练习

    redisson lock和tryLock 分布式锁简单练习

    Latch和Lock的区别

    有关oracle当中锁的描述,Latch和Lock的区别,挺不错的。

    Lock总结.doc

    java多线程之lock。 Lock的基本用法如下,为了防止异常退出时没有释放锁,一般都在拿到锁后立马try,try住所有临界区的代码,然后finally释放锁。

    AHK-CapsLock修改为回车-左手快捷键.ahk

    关键字-回车映射-ahk回车映射-左手回车 ;;快捷键x说明 上下左右 ... CapsLock+q 箭头上--防止误触屏-CapsLock+q也映射为箭头上 ;; CapsLock+e 删除键-删除前面的-Backspace ;; CapsLock+r 删除键-删除后面的--Del

    Synchronized 和 Lock 的区别和使用场景

    并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。 Synchronized 和 Lock的概念 Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized...

    java的lock和synchronized的区别.docx

    基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。

    更改win7左ctrl和capslock键

    修改注册表的文件,更改win7左ctrl和capslock键(reg文件一键导入)

    彻底搞清楚library cache lock的成因和解决方法

    因此,在对Package/Procedure/Function/View进行编译和分析的时候,我们必须确定此时没有人正在编译和分析相同的对象,即确保没有人也在此时改变这些需要重定义(drop和recreate)的对象的定义。

    JAVA Lock加锁实例

    Lock锁是对象锁,仅在同一对象中,锁才会生效。(不做论证) (以下场景皆为单例模式下运行) lock.lock()的加锁方式,会使后续请求的线程堵塞等待。(方案A) lock.tryLock()的加锁方式,不会堵塞,会立即返回加锁...

    实现yarnlock与packagelockjson相互转换

    实现yarn.lock与package-lock.json相互转换

    gradle lock文件清除

    gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 ...

    Lock、Synchoronized和ReentrantLock的使用

    Lock、Synchoronized和ReentrantLock的使用

    lock锁,lock锁和synchronized的对比

    lock锁,lock锁和synchronized的对比 # Lock锁 JDK5.0后Java提供了一种更加强大的线程同步机制。一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问...

    Android powermanger wakelock

    PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种: 第一种是永久的锁住,这样的锁除非显式的放开,否则是不会解锁的,所以这种锁用起来要非常的小心。 第二种锁是超时锁,这种锁会在锁住后一段时间...

    Lock-in Amplifier.pdf

    significance of a lock-in amplifier. As an introduction to the subject there follows a simple intuitive account biased towards light measurement applications. All lock-in amplifiers, whether ...

    精彩编程与编程技巧-设定CapsLock ScrollLock NumLock...

    设定CapsLock ScrollLock NumLock

    Active Lock U盘登录锁3.0破解版(U盘当电脑锁专业版支持win7)

    Active Lock可以将任何一款普通的U盘变成您的Windows登录钥匙。 启用Active Lock后,用户需要插入USB钥匙盘才能登录Windows操作系统,拔出U盘时自动锁住电脑。Active Lock采用Windows登录验证接口,支持Windows 2000...

    解决git:fatal:Unable to create”…/.git/index.lock” 的错误

    报错大致意思就是创建index.lock文件失败,因为已经存在index.lock文件了. index.lock文件是在.git下面, 而.git是一般是隐藏的, 那么可以通过以下命令删除即可. rm -rf /Users/dianji/project/ccpay.h5/.git/index....

    Capslock++,Capslock键利器

    Capslock++(AutoHotKey脚本),改造Capslock键,快速提升工作效率

    Capslock+工具

    Capslock+软件下载http://cjkis.me/capslock+/

Global site tag (gtag.js) - Google Analytics