1、线程代码中,for中的signal()能否与await()交换位置,为什么
2、线程代码中,for下的signal()能否去掉,为什么
3、上面的代码能否保证一定先输出数字,为什么,如何保证一定先输出数字
LockSupport + park + unpark
估计很多人都没想到这种方式,直接上代码
这是目前最优的解决方式,照样留四个问题(面试点)
1、t1.start()能否与t2.start()交换位置,为什么
2、线程 t1 中的LockSupport.unpark(t2)在线程 t2 中的LockSupport.park()之前执行会怎么样,为什么
3、上面的代码能否保证一定先输出数字,为什么
4、LockSupport的park、unpark与Object的wait、notify有什么异同
CAS
这种方式可能也比较难想到,直接上代码
这种方式也许不太好理解,留四个问题(面试点)加深理解
1、线程代码中,while条件为什么是 !=,而不是 ==
2、上面的代码能否保证一定先输出数字,为什么
3、CAS 的优缺点是什么,适用于什么场景
CAS + AtomicInteger
其实就是 CAS 的一个变种,直接上代码
CAS + AtomicReference
也是 CAS 的一个变种,直接上代码
TransferQueue
一般很难想象到这种方式,但却是很有趣的一种实现方式
如果不了解TransferQueue,那这种方式就想不到;同样留一个问题(面试点)
1、上面的代码能否保证一定先输出数字,为什么
BlockingQueue
一般也比较难想到这种方式,有所了解就好
PipedStream
效率很低,知道有这么回事就好
总结
==
1、示例代码地址:juc-demo
最后
做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。
更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务
…(img-rbJ2dxGF-1714540636707)]
[外链图片转存中…(img-IWcu7iPj-1714540636707)]
[外链图片转存中…(img-KjweMZ8P-1714540636707)]
[外链图片转存中…(img-ma2MU2ht-1714540636708)]