`
greemranqq
  • 浏览: 976944 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

lockInterruptibly 和 lock

阅读更多

一.序言

    ReentrantLock 锁有好几种,除了常用的lock tryLock 等意外,其中有个lockInterruptibly 用的比较少,看了下JDK 说明,官方的东西总是那么不容易理解,这里用稍微通俗的语言来描述一下。

 

二.栗子

     1.我们用张三和李四 吃水果来描述:

        如果张三吃苹果->休息5秒->吃香蕉

        李四:发现张三在吃,就等待,直到李四吃完

import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by qqr on 15/5/17.
 */
public class Lock {


    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new TaskThread());
        t1.setName("张三 ");
        Thread t2  = new Thread(new TaskThread());
        t2.setName("李四 ");
        t1.start();
        Thread.sleep(100);// 保证先后顺序

        t2.start();
        Thread.sleep(100);
        // 中断
        t2.interrupt();


    }


    static class TaskThread implements Runnable{
        // 所有线程都用同一把锁
        static ReentrantLock lock = new ReentrantLock();

        @Override
        public void run() {

            try {
                // 
                lock.lockInterruptibly();
                System.out.println(Thread.currentThread().getName() + " 吃苹果");

                Thread.sleep(5 * 1000);

                System.out.println(Thread.currentThread().getName() + " 吃香蕉");
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + " 被中断了,没吃了");
            }finally {
                lock.unlock();
            }

        }

    }
}

   返回结果是:

   

张三  吃苹果
张三  吃香蕉
李四  吃苹果
李四  被中断了,没吃了

 

   第一次如果用 lock() ,那么就是正常的逻辑:

   张三持有锁的时候,李四没有获得锁,打断效果也会阻塞着,等张三吃完,李四吃苹果,然后被打断,就是上面结果了。

 

     如果换成lockInterruptibly,那么结果是:

    

张三  吃苹果
李四  被中断了,没吃了
Exception in thread "李四 " java.lang.IllegalMonitorStateException
张三  吃香蕉

   

     我们会发现,即使李四没有获得锁,也是可以被打断的, 这个区别是很明显的。

 

    在linkedBlockingQuene 的put/take 方法中,我们可以看到类似这样的代码: 

    

public void put(E e) throws InterruptedException {
        // ....
        final ReentrantLock putLock = this.putLock;
        final AtomicInteger count = this.count;
        putLock.lockInterruptibly();
        try {
           while (count.get() == capacity) {
                notFull.await();
            }
            // ....
       }
}
  

 

   最为加锁的阻塞队列, 这里不允许多线程同时put,多线程对进入等待,但是用了lockInterruptibly,那么就意味着可以中断那些等待着的线程

 

 四.小结

      1.这里仅仅简单理解下他效果,可能并不全

      2.遇到其他的场景 或者 解释有问题,请分享 和指出,谢谢。

 

   

0
0
分享到:
评论

相关推荐

    java的lock和synchronized的区别.docx

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

    java的Lock锁原理详解.docx

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

    Synchronized 和 Lock 的区别和使用场景

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

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

    在实际编程中,Lock和条件变量常用于构建高级同步结构,如生产者-消费者模型、读写锁等。使用它们可以避免synchronized的某些限制,比如无法精确控制唤醒哪个等待线程。 以生产者-消费者模型为例,生产者线程会生产...

    java中的Lock类和Condition类.docx

    通过上述内容,我们可以看出,Lock和Condition类提供了比synchronized更高级别的线程同步和通信机制,使得开发者能够更好地控制线程的执行顺序,提高并发程序的效率和可控性。在实际开发中,根据具体需求选择使用...

    java 锁 Lock接口详解.docx

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

    JavaLock与Condition的理解Reentran

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

    java中Locks的使用详解

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

    关于synchronized、Lock的深入理解

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

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

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

    java_汇总知识点1

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

    locktest.zip

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

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

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

    详谈Lock与synchronized 的区别

    Java并发编程中,Lock接口和synchronized关键字是两种常见的互斥锁定机制,它们都用于确保多线程环境下的数据一致性。然而,它们在特性和使用上存在显著的区别。 首先,Lock是一个接口,它提供了比synchronized更细...

    笔记-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