LockSupport 使用
使用:
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 使用相关推荐
- 深入学习Lock锁(2)——LockSupport工具类
2019独角兽企业重金招聘Python工程师标准>>> 在同步组件中,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作.LockSupport定义 ...
- Java并发编程 LockSupport源码分析
这个类比较简单,是一个静态类,不需要实例化直接使用,底层是通过java未开源的Unsafe直接调用底层操作系统来完成对线程的阻塞. 1 package java.util.concurrent.loc ...
- Java高并发编程(七):读写锁、LockSupport、Condition
读写锁定义:读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读 线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很 ...
- java中的locksupport_详解Java多线程编程中LockSupport
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark() ...
- AQS理解之一,基础知识——LockSupport
AQS理解之一,基础知识--LockSupport LockSupport类位于java.util.concurrent包下. 顾名思义,就是一个实现锁的辅助类. 来看下他的类结构: 其中的变量都是通 ...
- LockSupport
LockSupport类是Java6引入的一个类,提供了基本的线程同步原语.LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数 unpark函数为线程提供& ...
- Java线程阻塞原语-LockSupport
在Java6引入LockSupport以前,线程挂起和唤醒要通过Object的wait和notify/notifyAllfangAll实现,但后者必须要在同步块里调用,且notify必须要在wait之 ...
- 多线程与高并发(四):LockSupport,高频面试题,AQS源码,以及源码阅读方法论
补充几道面试题 锁升级过程:无锁.偏向锁.轻量级锁.重量级锁 StampedLock 自己看一下 面试题:syn和Reentrantlock的区别? LockSupport LockSupport.p ...
- JUC锁-LockSupport(四)
LockSupport的介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且 ...
最新文章
- 第5篇:Flowable快速工作流脚手架Jsite_请假实战_部署流程和发起流程
- 全文匹配方式查询(sql)
- 综合支撑【恶灵附身 Psycho Break】的世界观的概念艺术
- 实用代码、链接、工具汇总
- 使用Python获取股票的基金持仓数据
- 免费\无限\开源的网页聊天工具Rocket.Chat安装
- 1.1.人工智能的概念
- 在ubntu下安装Sublime text
- 还记得那些老国手吗? 07
- 磁盘操作系统(DOS)
- window.onload的用法
- 空白新机设置——让新电脑nice一些
- 下一代防火墙是什么 下一代防火墙产品有哪些
- Centos执行.sh文件
- 3d动画用云渲染靠谱吗?
- 05-货币基金的秘密
- Ubuntu / Linux 各种操作指南
- 被爱毁灭——《无声告白》的读后感作文3000字
- 论文阅读-Robust Image Retargeting via Axis-Aligned Deformation
- css实现百叶窗切换图片效果
热门文章
- android的支付宝sdk 提示系统繁忙 请稍后再试_《活动运营中防系统扑街指南》
- OnTimer定时器使用踩坑实例和使用方法
- python异常处理的作用_python--异常处理
- honey select 模型导出_道路建模-基本模型
- yii 执行指定迁移文件_Web 云开发 · 云开发数据库迁移指南
- MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
- 第55件事 产品疯传的7个基本原则
- 知乎快捷取消我关注的问题chrome插件
- Linux日常运维管理技巧