龙空技术网

【Java面试】一道题轻松搞定二面!并发编程的三大核心...

学Java2 111

前言:

现在朋友们对“java2”可能比较着重,同学们都想要知道一些“java2”的相关文章。那么小编在网络上收集了一些关于“java2””的相关资讯,希望各位老铁们能喜欢,看官们一起来学习一下吧!

一道题轻松搞定二面:并发编程的三大核心问题。

恭喜你进入二面。接下来聊一聊技术性的问题,能说一下并发编程的三大问题吗?

·并发编程的三大问题是原子性有序性跟可见性。原子性就是要保证多个指令要么全部成功要么全部回滚,有序性就是可能指令会发生重排,可见性就是线程里面的更改的数据,其他线程可能不能马上的读到最新的。

·恭喜你通过二面了,等一下把offer发到邮箱里面,这道题的文字版我已经整理在五十万字的面试文档里面,大家如果有需要可以在评论区留言领取。

·好的面试官。所谓并发是处理器可以同时处理多个不同的任务从而提高整个系统的处理能力提升系统的性能。既然它能够提升性能,当然也会带来一些数据一致性的问题,这个也就是经常讲的原子性、有序性以及可见性问题。

所谓原子性问题就是不能保证多个操作,它是一个原子操作,在操作中间可能会有其他的线程对数据进行更改或者操作,这样可能会导致结果是不一致的。比如i++操作在底层其实是一次,先获取i然后执行i+1,最后再赋值给i。在并发的时候可能在执行i+1的时候其他线程也来执行i++,这个时候可能会导致上一次的执行结果被覆盖,解决方案可以用锁来解决。

·锁其实就是把并行改成串行有序性问题,在执行语句的时候会对在单线程下面不影响最终结果的指令进行排序,来提升执行性能。对单线程虽然没有影响,但是在多线程的情况下面其他线程拿到的数据可能因为重排而没有执行跟用户想要的数据可能不一致。

解决办法:在Java里面可以通过窝里跳关键字,通过volatile关键字来禁止指令重排,来禁止指令重排。

·第三个可见性问题。因为cpu都有自己的高速缓存,那么每个缓存都有自己独立的缓存数据。虽然不同的系统也会去采用一些不同的一些协效来保证数据一致性。比如MEIS协议,但是为了性能也会引入一些读写缓存,这也是可见性产生的根源。因为有了读写缓存,所以线程拿到的其他线程操作的数据不一定是最新的,这就是可见性问题。

当然读写缓存也是指令重排的一个根源。所以可见性跟有序性解决的办法都是使用窝里跳关键字来解决。

谢谢你来参加我们今天的面试,面试结果我会在3天之内给到你的,你今天先回去。

标签: #java2