2018java面试多线程进阶案例-实际线程锁同步案例

面试题1、三个线程A/B/C并发运行,B/C需要A线程的数据怎么实现?

分析:根据问题描述,我们将问题用一下代码演示,threadA/threadB/threadC,threadA用于初始化数据num,只有当num初始化完成之后再让threadB和threadC获取到初始化后的变量num。考虑到线程的不确定性,因此我们不能确保threadA就一定先于threadB和trheadC前执行,就算threadA先执行了,我们也不能保证threadA什么时候才能将变量num初始化完成。因此我们必须让threadB和threadC去等待threadA完成之后发出消息。现在需要解决2个难题,一是让threadB和threadC等待threadA先执行完成;二是threadA执行完成后给threadB和threadC发送消息。这里给出了使用纯java API的Semaphore类来控制线程的等待和释放,案例代码如下:

2018java面试多线程进阶案例-实际线程锁同步案例

面试题1:线程等待与唤醒案例

2018java面试多线程进阶案例-实际线程锁同步案例

面试题1运行效果图

面试题2、同一个类中的2个方法都加了同步锁,多个线程能否同时访问同一个类中的这两个方面吗?

分析:这个问题考虑到Lock和synchronized两种实现锁的不同情形。两种锁的结果是截然不同的。Lock可以让等待锁的线程响应中断,Lock获取锁,之后需要释放锁。演示两个锁的使用及运行结果代码如下:

2018java面试多线程进阶案例-实际线程锁同步案例

面试题2:Lock锁

2018java面试多线程进阶案例-实际线程锁同步案例

面试题2:Lock锁运行结果

2018java面试多线程进阶案例-实际线程锁同步案例

面试题2:synchronized锁

2018java面试多线程进阶案例-实际线程锁同步案例

面试题2:synchronized锁运行结果

由上两个源码效果可知,Lock锁不能同时,synchronized可以同时访问。

2018java面试多线程进阶案例-实际线程锁同步案例


分享到:


相關文章: