====
用两个线程,一个输出数字,一个输出字母,交替输出 1A2B3C4D…26Z
该如何实现?
解决方式
====
据说解决方式有上百种,但有些是脱了裤子放屁,有些是民间偏方,所以没必要全部都知道(其实楼主也不知道具体是哪一百多种)
掌握常用的那几个就好;为了方便,我们就以1234567和ABCDEFG为例进行演示
synchronized + wait + notify
如果我们对JUC不熟的话,那这种方式往往是我们最容易想到的
这种方式,相信大家都能写出来,但是这里留三个问题(面试点)
1、线程代码中,try中的notify()能否与wait()交换位置,为什么
2、线程代码中,for下的notify()能否去掉,为什么
3、上面的代码能否保证一定先输出数字,为什么,如何保证一定先输出数字
ReentrantLock + Condition + await + signal
很多场景下,用ReentrantLock可以替代synchronized,而在交叉输出这个场景中,同样可以替代
这种方式,写出来应该也不难,同样留三个问题(面试点)
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 的优缺点是什么,适用于什么场景
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。
这些面试题相对应的技术点:
- JVM
- MySQL
- Mybatis
- MongoDB
- Redis
- Spring
- Spring boot
- Spring cloud
- Kafka
- RabbitMQ
- Nginx
- …
大类就是:
- Java基础
- 数据结构与算法
- 并发编程
- 数据库
- 设计模式
- 微服务
- 消息中间件
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-0upeGx6R-1712961011053)]
[外链图片转存中…(img-Y5YB40DQ-1712961011053)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-KWGHEQA8-1712961011053)]