6. LockSupport

回顾前面部分的源码分析,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具来完成相应工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒公共,而LockSupport也成为构建同步组件的基础工具。

LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及upark方法用来唤醒线程。这些方法如下所示:

方法名称 描述
void park() 阻塞当前线程,如果调用unpark(Thread)或者当前线程被中断,才能从park()方法返回
void parkNanos(long nanos) 阻塞当前线程,最长不超过nanos纳秒,返回条件在park()的基础上增加了超时返回
void parkUntil(long deadline) 阻塞当前线程,直到deadline
void unpark(Thread thread) 唤醒处于阻塞的线程thread

在Java 6新增了void park(Object blocker), void parkNanos(Object blocker, long nanos), void parkUntil(Object blocker, long deadline)三个方法,用以实现阻塞当前线程的功能,其中参数blocker是用来标识当前线程在在等待的对象(以下称阻塞对象),该对象主要用于问题排查和系统监控。

下面的示例中,将对比parkNanos(long nanos)parkNanos(Object blocker, long nanos)方法来展示阻塞对象blocker的用处,代码片段和线程dump如下:

对比项\方法 parkNanos(long nanos) parkNanos(Object blocker, long nanos)
代码片段 LockSupport.parkNanos(TimeUnit.
SECONDS.toNanos(10))
LockSupport.parkNanos(test, TimeUnit.SECONDS.toNanos(10));
线程
dump
结果
"main" #1 prio=5 os_prio=0 tid=
0x0000025636fb9000 nid=0x1494 waiting
on condition [0x000000bbe3fff000]
java.lang.Thread.State:
TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park
(java.base@10.0.2/Native Method)
at java.util.concurrent.locks.LockSupport.
parkNanos(java.base@10.0.2/
LockSupport.java:357)
"main" #1 prio=5 os_prio=0 tid=0x000002b0ceda8800 nid=0x724 waiting on condition [0x000000c6acafe000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base
@10.0.2/Native Method)
- parking to wait for <0x00000006d119f9d8>
(a p5.LockSupportTest)

at java.util.concurrent.locks.LockSupport.parkNanos
(java.base@10.0.2/LockSupport.java:234)

从表中的线程dump结果可以看出,代码片段的内容是阻塞当前线程10s,但从线程dump结果可以看出,有阻塞对象的parkNanos方法能够传递给开发人员更多的线程信息。这是由于java 5之前,在线程阻塞(使用synchronized关键字)在一个对象上时,通过线程dump能够查看到该线程的阻塞对象,方便问题定位,而在java 5推出的Lock等并发工具时却遗漏了这一点,致使线程dump时无法提供阻塞对象的信息。因此,在java 6中,LockSupport新增了上述三个含有阻塞对象的park方法。

如果遗忘了如果进行线程dump操作,这里再温习一下。
运行测试方法(不一定是"main")后,在终端输入jps命令:
10964
2740 Launcher
9224 Program
12956 LockSupportTest
14300 KotlinCompileDaemon
7740 Jps

从中找到测试类对应的线程id,此处是 12956,然后终端输入jstack 12956,即可输出线程dump信息,然后从中寻找到对应测试方法的信息,此处为"main" #1 prio=5 os_prio=0 tid=0x0000025636fb9000 nid=0x1494 .....

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • 关于文章涉及到的jdk源码,这里把最新的jdk源码分享给大家----->jdk源码 前言 在上篇文章《Java并发...
    AndyJennifer阅读 1,939评论 0 5
  • 原创文章&经验总结&从校招到A厂一路阳光一路沧桑 详情请戳www.codercc.com 1. LockSuppo...
    你听___阅读 9,606评论 1 9
  • LockSupport,构建同步组件的基础工具,帮AQS完成相应线程的阻塞或者唤醒的工作。 LockSupport...
    miaoLoveCode阅读 15,329评论 3 23
  • jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机...
    sherlock_6981阅读 938评论 0 0
  • 金庸走了,让我们懂得活着得有追求,只有奋斗终生才能有快意恩仇, 李咏走了,让我们知道生命必须依托健康,健康才是生命...
    言轻严青阅读 96评论 0 2