多线程同步之LockSupport

Posted xiaohuanqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程同步之LockSupport相关的知识,希望对你有一定的参考价值。

多线程同步的方式有很多种,synchronized,wait/notify,lock/condition等,这里介绍一下 LockSupport。

对于传统的wait/notify这种比较low的做法,1,要自己维护一套锁对象;2,必须在同步代码块中使用,3,无法控制两者之间执行顺序导致有时候会形成阻塞情况,4,开销比较大。

先来一个LockSupport的Demo吧:

相比于wait/notify的方式要简单很多(这种方式的代码就不展示了),而且不管执行多少次都不会出现阻塞的情况。

LockSupport优势:

  • ①LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦。

  • ②unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。

接下来看一个题:

题目:

 * 已知数组 A 内容为1、2、3、4...52,数组 B 内容为 26 个英文字
 * 母,使用两个线程分别输入两个数组,然后使程序运行打印内容为 
 * 12a34b56c78e... 的规律,请给出代码实现?

最传统的做法就是使用wait/notify了,但是也是最low的,介绍两个比较有优势的方式。

方案一:自旋锁 yield

定义两个实现Thread的类,一个负责打印数字,一个负责打印字符

PrintNumbers:

PrintChars:

测试:

方案二:LockSupport

PrintNumbers:

PrintChars

测试:

多线程同步问题是比较复杂的问题,多了解一些方式总是好的,这里就小酌一杯。

以上是关于多线程同步之LockSupport的主要内容,如果未能解决你的问题,请参考以下文章

多线程之LockSupport,线程阻塞与唤醒(十四)

JUC之LockSupport构建同步组件的基本工具

java多线程 更优雅的实现线程同步:交替打印AB LockSupport实现

Java多线程系列--“JUC锁”07之 LockSupport

Java多线程Day22-JUC锁之LockSupport

Java多线程Day22-JUC锁之LockSupport