阿里巴巴面试题- - -多线程&并发篇(三十五)

79 阅读1分钟

​​本文已参与「新人创作礼」活动,一起开启掘金创作之路

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux等技术栈

** 再次渡入繁世,人潮汹涌,眼里茫然,信仰永恒,皆为华夏**

​编辑

目录

多线程&并发篇

30,说一下线程之间是如何通信的?

31、CAS的原理呢?

32、CAS有什么缺点吗?

本期分享到此为止,关注博主不迷路,叶秋学长带你上高速~~


多线程&并发篇

30,说一下线程之间是如何通信的?

线程之间的通信有两种方式:共享内存和消息传递。

共享内存

在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。典型的共享内存通信方式,就是通过共享对象进行通信。

例如上图线程 A 与 线程 B 之间如果要通信的话,那么就必须经历下面两个步骤:

  1. 线程 A 把本地内存 A 更新过得共享变量刷新到主内存中去。

  2. 线程 B 到主内存中去读取线程 A 之前更新过的共享变量。

消息传递

在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行

通信。在 Java 中典型的消息传递方式,就是 wait() 和 notify() ,或者BlockingQueue 。

31、CAS的原理呢?

CAS叫做CompareAndSwap,比较并交换,主要是通过处理器的指令来保证操作的原子性,它包含三个操作数:

  1. 变量内存地址,V表示

  2. 旧的预期值,A表示

  3. 准备设置的新值,B表示

当执行CAS指令时,只有当V等于A时,才会用B去更新V的值,否则就不会执行更新操作。

32、CAS有什么缺点吗?

CAS的缺点主要有3点:

ABA问题:ABA的问题指的是在CAS更新的过程中,当读取到的值是A,然后准备赋值的时候仍然是

A,但是实际上有可能A的值被改成了B,然后又被改回了A,这个CAS更新的漏洞就叫做ABA。只是ABA的问题大部分场景下都不影响并发的最终效果。

Java中有AtomicStampedReference来解决这个问题,他加入了预期标志和更新后标志两个字段,更新时不光检查值,还要检查当前的标志是否等于预期标志,全部相等的话才会更新。

循环时间长开销大:自旋CAS的方式如果长时间不成功,会给CPU带来很大的开销。

只能保证一个共享变量的原子操作:只对一个共享变量操作可以保证原子性,但是多个则不行,多个可以通过AtomicReference来处理或者使用锁synchronized实现。

本期分享到此为止,关注博主不迷路,叶秋学长带你上高速~~