Java面试之多线程&并发篇(7)

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

媒介

原来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!线程安全需要包管几个基本特性?说一下线程之间是如何通信的?CAS的原理呢?CAS有什么缺点吗?好像有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘
*** 12万字的java面试题整理 ***
*** java核心面试知识整理 ***
*** Java高频面试讲解视频(知识涵盖齐全) ***
线程安全需要包管几个基本特性?


  • 原子性,简单说就是相关操纵不会中途被其他线程干扰,一样平常通过同步机制实现。
  • 可见性,是一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,volatile 就是负责包管可见性的。
  • 有序性,是包管线程内串行语义,避免指令重排等。
说一下线程之间是如何通信的?

线程之间的通信有两种方式:共享内存和消息传递。
共享内存
在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式举行通信。典型的共享内存通信方式,就是通过共享对象举行通信。
例如上图线程 A 与 线程 B 之间如果要通信的话,那么就必须履历下面两个步骤:

  • 线程 A 把本地内存 A 更新过得共享变量刷新到主内存中去。
  • 线程 B 到主内存中去读取线程 A 之前更新过的共享变量。
消息传递
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式举行通信。在 Java 中典型的消息传递方式,就是 wait() 和 notify() ,或者 BlockingQueue 。
CAS的原理呢?

CAS叫做CompareAndSwap,比较并互换,主要是通过处理处罚器的指令来包管操纵的原子性,它包罗三个操纵数:

  • 变量内存地址,V表示
  • 旧的预期值,A表示
  • 准备设置的新值,B表示
    当实行CAS指令时,只有当V等于A时,才会用B去更新V的值,否则就不会实行更新操纵。
CAS有什么缺点吗?

CAS的缺点主要有3点:

  • ABA题目:ABA的题目指的是在CAS更新的过程中,当读取到的值是A,然后准备赋值的时间仍旧是A,但是实际上有可能A的值被改成了B,然后又被改回了A,这个CAS更新的漏洞就叫做ABA。只是ABA的题目大部分场景下都不影响并发的最终效果。
    Java中有AtomicStampedReference来解决这个题目,他加入了预期标志和更新后标志两个字段,更新时不光检查值,还要检查当前的标志是否等于预期标志,全部相等的话才会更新。
  • 循环时间长开销大:自旋CAS的方式如果长时间不乐成,会给CPU带来很大的开销。
  • 只能包管一个共享变量的原子操纵:只对一个共享变量操纵可以包管原子性,但是多个则不行,多个可以通过AtomicReference来处理处罚或者使用锁synchronized实现。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表