11.12 两个线程如何交替执行,一个输出偶数一个输出奇数?

来源:cnblogs.com/stateis0/p/9091254.html

前言

楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多。大部分同学都会使用 synchronized 来实现。楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄!

第一种 synchronized

两个线程如何交替执行,一个输出偶数一个输出奇数?

两个线程如何交替执行,一个输出偶数一个输出奇数?

通过 synchronized 同步两个方法,每次只能有一个线程进入,每打印一个数,就释放锁,另一个线程进入,拿到锁,打印,唤醒另一个线程,然后挂起自己。循环反复,实现了一个最基本的打印功能。

但,如果你这么写,面试官肯定是不满意的。楼主将介绍一种更好的实现。

使用 CAS 实现

两个线程如何交替执行,一个输出偶数一个输出奇数?

两个线程如何交替执行,一个输出偶数一个输出奇数?

我们通过使用 CAS,避免线程的上下文切换,然后呢,使用一个 volatile 的 boolean 变量,保证不会出现可见性问题,记住,这个 flag 一定要是 volatile 的,如果不是,可能你的程序运行起来没问题,但最终一定会出问题,而且面试官会立马鄙视你。

这样就消除了使用 synchronized 导致的上下文切换带来的损耗,性能更好。相信,如果你面试的时候,这么写,面试官肯定很满意。

但,我们还有性能更好的。

使用 volatile

两个线程如何交替执行,一个输出偶数一个输出奇数?

两个线程如何交替执行,一个输出偶数一个输出奇数?

我们使用 volatile 变量代替 CAS 变量,减轻使用 CAS 的消耗,注意,这里 ++num 不是原子的,但不妨碍,因为有 flag 变量控制。而 num 必须是 volatile 的,如果不是,会导致可见性问题。

到这里,如果你面试的时候这么写,那么,offer 就不远啦!哈哈!!

彩蛋 如何翻转字符串?

两个线程如何交替执行,一个输出偶数一个输出奇数?

这个就比较简单了,两种方式,一个是 StringBuilder 的 reverse 方法,一个是转换成数组自己打印。自己转换性能更好,reverse 方法内部步骤更多。

好啦,希望大家面试成功!!


分享到:


相關文章: