菜鸟笔记
提升您的技术认知

面试一家小公司,被问了 1 个小时并发编程-ag真人游戏

阅读 : 520

最近有读者投简历去一家小公司去面试的时候,和面试官聊了一个小时的并发编程,整个过程已全记录下来。

面试的时候小心翼翼,如履薄冰,生怕说错一句话,就错失机会,担心,面试紧张、卡壳。不知道大家有没有这个问题?

面试官:_你知道cas吗,能跟我讲讲吗?

我:_cas(compare and swap),比较并交换。整个aqs同步组件,atomic原子类操作等等都是基于cas实现的,甚至concurrenthashmap在jdk1.8版本中,也调整为cas synchronized。可以说,cas是整个juc的基石。

cas的实现方式其实不难。在cas中有三个参数:内存值v、旧的预期值a、要更新的值b,当且仅当内存值v的值等于旧的预期值a时,才会将内存值v的值修改为b,否则什么也不干,是一种乐观锁。其伪代码如下:

我:接着我举了个atomicinteger的例子,来给面试官阐述cas的实现。
面试官:
那cas有什么缺陷吗?

我:_cas虽然高效的解决了原子问题,但是还是存在一些缺陷的,主要体现在三个方面:

1.循环时间太长:

如果自旋cas长时间不成功,则会给cpu带来非常大的开销,在juc中,有些地方就会限制cas自旋的次数。

2.只能保证一个共享变量原子操作:

看了cas的实现就知道这只能针对一个共享变量,如果是多个共享变量就只能使用锁了。或者把多个变量整成一个变量也可以用cas。

3.aba问题:

cas需要检查操作值有没有发生改变,如果没有发生改变则更新,但是存在这样一种情况:如果一个值原来是a,变成了b,然后又变成了a,那么在cas检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的aba问题。对于aba问题的ag真人游戏的解决方案是加上版本号,即在每个变量都加上一个版本号,每次改变时加1,即a->b->a,变成1a->2b->3a。例如原子类中atomicinteger会发生aba问题,使用atomicstampedreference可以解决aba问题。

面试官:你能说下轻量级锁吗?

面试官:你先说下你对synchronized的了解。

面试官:什么是原子操作?

面试官:什么是executors框架?

面试官:什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

面试官:cyclibarriar和countdownlatch有什么区别?

面试官:java中用到的线程调度算法是什么?

我:...................................

总结

面试的时候,开口第一句,面试官就知道你的水平了。你很多东西用过,但是并不懂底层原理,面试官一问,你就哑火了…

网站地图