多线程同步的方式有很多种,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
测试:
多线程同步问题是比较复杂的问题,多了解一些方式总是好的,这里就小酌一杯。