使用:

package com.xinyu.test;import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;public class LockSupportTest {public static void main(String[] args) {Thread thread = Thread.currentThread();new Thread(){@Overridepublic void run() {super.run();try {sleep(1000);LockSupport.unpark(thread);} catch (InterruptedException e) {e.printStackTrace();}}}.start();LockSupport.park();LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));System.out.println(1);}
}

LockSupport

LockSupport 的作用,就是阻塞一个线程,等待另外一个线程去唤醒。和wait、notify 很像,但是有区别。
(1)wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。

(2)notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。

在JDK 里面的使用:

java.util.concurrent.SynchronousQueue.TransferStack#awaitFulfill

        SNode awaitFulfill(SNode s, boolean timed, long nanos) {/** When a node/thread is about to block, it sets its waiter* field and then rechecks state at least one more time* before actually parking, thus covering race vs* fulfiller noticing that waiter is non-null so should be* woken.** When invoked by nodes that appear at the point of call* to be at the head of the stack, calls to park are* preceded by spins to avoid blocking when producers and* consumers are arriving very close in time.  This can* happen enough to bother only on multiprocessors.** The order of checks for returning out of main loop* reflects fact that interrupts have precedence over* normal returns, which have precedence over* timeouts. (So, on timeout, one last check for match is* done before giving up.) Except that calls from untimed* SynchronousQueue.{poll/offer} don't check interrupts* and don't wait at all, so are trapped in transfer* method rather than calling awaitFulfill.*/final long deadline = timed ? System.nanoTime() + nanos : 0L;Thread w = Thread.currentThread();int spins = (shouldSpin(s) ?(timed ? maxTimedSpins : maxUntimedSpins) : 0);for (;;) {if (w.isInterrupted())s.tryCancel();SNode m = s.match;if (m != null)return m;                else if (!timed)LockSupport.park(this);else if (nanos > spinForTimeoutThreshold)LockSupport.parkNanos(this, nanos);}}

java.util.concurrent.SynchronousQueue.TransferStack.SNode#tryMatch

            boolean tryMatch(SNode s) {if (match == null &&UNSAFE.compareAndSwapObject(this, matchOffset, null, s)) {Thread w = waiter;if (w != null) {    // waiters need at most one unparkwaiter = null;LockSupport.unpark(w);}return true;}return match == s;}

我们可以看到在jdk 里面的LockSupport 的身影,当我们队列没有元素的时候,我们就锁住当前线程,等待别的线程往里面放元素后解锁线程。

参考:

https://baijiahao.baidu.com/s?id=1666548481761194849&wfr=spider&for=pc

LockSupport 使用相关推荐

  1. 深入学习Lock锁(2)——LockSupport工具类

    2019独角兽企业重金招聘Python工程师标准>>> 在同步组件中,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作.LockSupport定义 ...

  2. Java并发编程 LockSupport源码分析

    这个类比较简单,是一个静态类,不需要实例化直接使用,底层是通过java未开源的Unsafe直接调用底层操作系统来完成对线程的阻塞. 1 package java.util.concurrent.loc ...

  3. Java高并发编程(七):读写锁、LockSupport、Condition

    读写锁定义:读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读 线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很 ...

  4. java中的locksupport_详解Java多线程编程中LockSupport

    LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark() ...

  5. AQS理解之一,基础知识——LockSupport

    AQS理解之一,基础知识--LockSupport LockSupport类位于java.util.concurrent包下. 顾名思义,就是一个实现锁的辅助类. 来看下他的类结构: 其中的变量都是通 ...

  6. LockSupport

    LockSupport类是Java6引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数 unpark函数为线程提供& ...

  7. Java线程阻塞原语-LockSupport

    在Java6引入LockSupport以前,线程挂起和唤醒要通过Object的wait和notify/notifyAllfangAll实现,但后者必须要在同步块里调用,且notify必须要在wait之 ...

  8. 多线程与高并发(四):LockSupport,高频面试题,AQS源码,以及源码阅读方法论

    补充几道面试题 锁升级过程:无锁.偏向锁.轻量级锁.重量级锁 StampedLock 自己看一下 面试题:syn和Reentrantlock的区别? LockSupport LockSupport.p ...

  9. JUC锁-LockSupport(四)

    LockSupport的介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且 ...

最新文章

  1. 第5篇:Flowable快速工作流脚手架Jsite_请假实战_部署流程和发起流程
  2. 全文匹配方式查询(sql)
  3. 综合支撑【恶灵附身 Psycho Break】的世界观的概念艺术
  4. 实用代码、链接、工具汇总
  5. 使用Python获取股票的基金持仓数据
  6. 免费\无限\开源的网页聊天工具Rocket.Chat安装
  7. 1.1.人工智能的概念
  8. 在ubntu下安装Sublime text
  9. 还记得那些老国手吗? 07
  10. 磁盘操作系统(DOS)
  11. window.onload的用法
  12. 空白新机设置——让新电脑nice一些
  13. 下一代防火墙是什么 下一代防火墙产品有哪些
  14. Centos执行.sh文件
  15. 3d动画用云渲染靠谱吗?
  16. 05-货币基金的秘密
  17. Ubuntu / Linux 各种操作指南
  18. 被爱毁灭——《无声告白》的读后感作文3000字
  19. 论文阅读-Robust Image Retargeting via Axis-Aligned Deformation
  20. css实现百叶窗切换图片效果

热门文章

  1. android的支付宝sdk 提示系统繁忙 请稍后再试_《活动运营中防系统扑街指南》
  2. OnTimer定时器使用踩坑实例和使用方法
  3. python异常处理的作用_python--异常处理
  4. honey select 模型导出_道路建模-基本模型
  5. yii 执行指定迁移文件_Web 云开发 · 云开发数据库迁移指南
  6. MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建
  7. 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
  8. 第55件事 产品疯传的7个基本原则
  9. 知乎快捷取消我关注的问题chrome插件
  10. Linux日常运维管理技巧