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(), 拿不到锁就 一直阻塞:
- @Test
- publicvoid test3()throwsException{
- finalLock lock=newReentrantLock();
- lock.lock();
- Thread.sleep(1000);
- Thread t1=newThread(newRunnable(){
- @Override
- publicvoid run(){
- lock.lock();
- System.out.println(Thread.currentThread().getName()+" interrupted.");
- }
- });
- t1.start();
- Thread.sleep(1000);
- t1.interrupt();
- Thread.sleep(1000000);
- }
可以进一步在Eclipse debug模式下观察,子线程一直阻塞。
2). lockInterruptibly()会响应打扰 并catch到InterruptedException
- @Test
- publicvoid test4()throwsException{
- finalLock lock=newReentrantLock();
- lock.lock();
- Thread.sleep(1000);
- Thread t1=newThread(newRunnable(){
- @Override
- publicvoid run(){
- try{
- lock.lockInterruptibly();
- }catch(InterruptedException e){
- System.out.println(Thread.currentThread().getName()+" interrupted.");
- }
- }
- });
- t1.start();
- Thread.sleep(1000);
- t1.interrupt();
- Thread.sleep(1000000);
- }
3). 以下实验验证:当线程已经被打扰了(isInterrupted()返回true)。则线程使用lock.lockInterruptibly(),直接会被要求处理InterruptedException。
- @Test
- publicvoid test5()throwsException{
- finalLock lock=newReentrantLock();
- Thread t1=newThread(newRunnable(){
- @Override
- publicvoid run(){
- try{
- Thread.sleep(2000);
- lock.lockInterruptibly();
- }catch(InterruptedException e){
- System.out.println(Thread.currentThread().getName()+" interrupted.");
- }
- }
- });
- t1.start();
- t1.interrupt();
- Thread.sleep(10000000);
- }
相关推荐
Lock锁是对象锁,仅在同一对象中,锁才会生效。(不做论证) (以下场景皆为单例模式下运行) lock.lock()的加锁方式,会使后续请求的线程堵塞等待。(方案A) lock.tryLock()的加锁方式,不会堵塞,会立即返回加锁...
本文总结了Java中Lock的各种用法。
JavaLock与Condition的理解ReentrantLock锁的简单使用技巧共5页.pdf.zip
【Java面试题】lock与synchronized区别
而lock是用java类,用java可以实现 2.synchronized可以锁住代码块,对象和类,但是线程从开始获取锁之后开发者不能进行控制和了解;lock则用起来非常灵活,提供了许多api可以让开发者去控制加锁和释放锁等等。
当前的PPT总共56页,从锁的介绍,到java锁(lock、synchronor、aqs)到分布式锁 redis、zk、数据库的悲观锁和乐观锁都有涉及,算是比较完整的一个PPT,适合涉及到锁相关的专题讲座,以及自学的PPT,后面有机会会开...
主要介绍了java Lock接口详解及实例代码的相关资料,需要的朋友可以参考下
主要介绍了Java Lock接口实现原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大。本文章的所有...
演示如何通过java nio设计lock
RedisLock.java
DistributedLock.java
Doorlock.java
LocalLock.java
主要介绍了Java锁机制Lock用法,结合具体实例形式分析了Java锁机制的相关上锁、释放锁、隐式锁、显式锁等概念与使用技巧,需要的朋友可以参考下
redisson lock和tryLock 分布式锁简单练习