`
Alexander-Mahone
  • 浏览: 7853 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

LockSupport 理论与实践

阅读更多
JavaAPI对LockSupport的解释是:用来创建锁和其他同步类的基本线程阻塞原语。

LockSupport 与Thread.suspend()和Thread.resume()的区别
在LockSupport出现之前,如果要block/unblock某个Thread,除了使用Java语言内置的monitor机制之外,只能通过Thread.suspend()和Thread.resume()。目前这两个方法都被标注为废弃,为什么 Thread.suspend 和 Thread.resume 被废弃了?
来自Oracle的官方文档Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?有如下解释:
Thread.suspend 天生容易引起死锁。如果目标线程挂起时在保护系统关键资源的监视器上持有锁,那么其他线程在目标线程恢复之前都无法访问这个资源。如果要恢复目标线程的线程在调用 resume 之前试图锁定这个监视器,死锁就发生了。这种死锁一般自身表现为“冻结( frozen )”进程。
LockSupport使用park和unpark方法进行线程的阻塞和解除阻塞操作,每个使用这个类的线程都将与一个许可关联,如果许可可用,则调用park立即返回;否则可能阻塞。如果许可不可用,则调用unpark使其可用,从而避免了死锁问题。

LockSupport 与 Object Monitor的区别
LockSupport是针对特定线程来进行阻塞和解除阻塞操作的;而Object的wait()/notify()/notifyAll()是用来操作特定对象的等待集合的。有关Java内置monitor的知识可参考:Java Monitor 理论与实践。

LockSupport与伪唤醒问题
跟Object.wait()方法一样,park系列方法也会因为伪唤醒的原因返回。为了防止上述情况发生,park方法的使用需要遵守如下约定:
while (!canProceed()) { ... LockSupport.park(this); }

使用示例
使用LockSupport 构建一个先进先出 (first-in-first-out) 非重入锁类的框架。
这个示例使用原子布尔类型来表示锁定的状态,使用队列来存放阻塞的线程。
class FIFOMutex {
   private final AtomicBoolean locked = new AtomicBoolean(false);
   private final Queue<Thread> waiters
     = new ConcurrentLinkedQueue<Thread>();

   public void lock() {
     boolean wasInterrupted = false;
     Thread current = Thread.currentThread();
     waiters.add(current);

     // Block while not first in queue or cannot acquire lock
     while (waiters.peek() != current ||
            !locked.compareAndSet(false, true)) {
        LockSupport.park(this);
        if (Thread.interrupted()) // ignore interrupts while waiting
          wasInterrupted = true;
     }

     waiters.remove();
     if (wasInterrupted)          // reassert interrupt status on exit
        current.interrupt();
   }

   public void unlock() {
     locked.set(false);
     LockSupport.unpark(waiters.peek());
   }
 }

参考资料
Java1.6 API http://docs.oracle.com/javase/6/docs/api/
Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?
中文版连接 http://alexander-mahone.iteye.com/blog/1841142
分享到:
评论

相关推荐

    LockSupport

    LockSupport.xmid总结,用于知识巩固,

    Java 多线程与并发(9-26)-JUC锁- LockSupport详解.pdf

    使用LockSupport进行线程同步,与传统的wait/notify或者wait/notifyAll方法相比,提供了更加细粒度的控制。通过LockSupport提供的方法,可以实现对线程阻塞和解除阻塞的精确控制,而不需要依赖于对象锁。 ...

    Java中LockSupport的使用.docx

    在实际使用中,LockSupport通常与其他同步工具一起配合使用,例如ReentrantLock和Semaphore等,通过精细控制线程的阻塞和唤醒,实现复杂的并发控制逻辑。然而,由于其底层实现涉及到了`sun.misc.Unsafe`类,这是一组...

    Java并发编程学习之Unsafe类与LockSupport类源码详析

    《深入解析Java并发编程:Unsafe类与LockSupport类源码剖析》 在Java并发编程领域,Unsafe类和LockSupport类是两个重要的底层工具类,它们提供了低级别的内存操作和线程控制,使得开发者能够实现高效的并发算法和...

    Java并发编程之LockSupport、Unsafe详解.docx

    在Java并发编程中,LockSupport和Unsafe是两个关键的工具类,它们提供了底层的线程控制功能,使得开发者能够深入地管理和控制线程的行为。LockSupport是Java并发库中的一个核心工具类,它提供了线程的阻塞和唤醒功能...

    详解Java多线程编程中LockSupport类的线程阻塞用法

    在Java多线程编程中,LockSupport类是一个重要的工具,它提供了一种低级别的线程阻塞和唤醒机制。LockSupport并不像synchronized或java.util.concurrent.locks包中的Lock接口那样提供锁的完整功能,但它提供了两个...

    java线程阻塞中断与LockSupport使用介绍

    LockSupport.park()和unpark()与object.wait()和notify()的区别** `LockSupport.park()` 和 `unpark(Thread thread)` 提供了更为底层的线程挂起和唤醒机制,没有等待条件或锁的概念。`object.wait()` 和 `notify()...

    Java concurrency之LockSupport_动力节点Java学院整理

    Java concurrency之LockSupport Java concurrency之LockSupport是Java并发编程中的一种基础设施,用于创建锁和其他同步类的基本线程阻塞原语。LockSupport提供了一组函数来实现线程之间的同步和通信,使得开发者...

    LockSupportTester.zip

    "LockSupportTester.zip"中可能包含了使用LockSupport进行的测试代码,可能包括创建线程,线程间通过LockSupport进行交互,观察线程的阻塞与唤醒效果。分析这些测试代码有助于深入理解LockSupport的工作机制。 ...

    android demo,locksuport的unpark一个线程。

    在Android开发中,`LockSupport` 是一个非常重要的工具类,它属于并发处理包 `java.util.concurrent.locks`。...通过对 `test_locksuport_unpark` 示例的分析和实践,你可以进一步提升自己在并发编程方面的技能。

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    本文将基于JDK源码解析Java领域中的并发锁,探讨AQS基础同步器、LockSupport、Condition接口、Lock接口、ReadWriteLock接口以及自定义API操作的设计与实现。 一、AQS(AbstractQueuedSynchronizer)基础同步器的...

    Java Thread Programming

    总之,“Java Thread Programming”这本书将帮助读者全面理解Java中的线程编程,从基础知识到高级技术,从理论到实践,为构建高效并发程序打下坚实基础。通过深入学习和实践,开发者可以在并发编程领域更加游刃有余...

    尚硅谷大厂面试题第三季周阳主讲

    【描述】提到的重点在于JUC(Java并发包)中的可重入锁概念,以及与之相关的锁机制,如LockSupport工具类的使用。此外,还提到了LockSupport如何实现线程的阻塞和唤醒,以及AbstractQueuedSynchronizer (AQS) 在锁和...

    Tomcat启动失败的问题排查与解决

    最近在工作中遇到一个问题,在发布失败的机器上Tomcat一直没有启动成功,所以只能想办法排查解决,下面这篇文章就介绍了在Tomcat启动时可能遇到的问题排查与解决方法,需要的朋友可以参考借鉴,下面来一起看看吧。

    Java多线程和并发知识整理

    Java多线程和并发知识是Java开发...以上内容涵盖了Java多线程和并发编程的主要知识点,从理论到实践,从基础到高级,全面解析了并发编程的核心概念和工具。掌握这些知识,开发者可以编写出高效、可靠的多线程应用程序。

    源码解析文件ScheduledThreadPoolExecutor

    ScheduledThreadPoolExecutor 使用DelayedWorkQueue来实现延迟任务的执行,并使用LockSupport.parkNanos 方法来阻塞当前线程,直到队列中有任务可用。 在 Java 中,ScheduledThreadPoolExecutor 是一个高效的线程池...

    尚硅谷面试题第三季1

    【部分内容】:章节内容主要涵盖Java基础,包括字符串常量池的行为,以及JUC(Java并发工具包)中的可重入锁原理和LockSupport的线程阻塞与唤醒机制。 1. **Java基础 - 字符串常量池** - 在JDK7及以上版本,字符串...

    LockSupportTest.java

    LockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习demoLockSupport学习...

    [bugfix]重新理解Thread的InterruptedException

    `Thread`类是Java多线程编程的核心,而`InterruptedException`异常则是与线程中断密切相关的。本文将深入探讨`InterruptedException`异常,以及如何在实际编程中正确处理它。 首先,我们需要了解线程的中断机制。...

Global site tag (gtag.js) - Google Analytics