2020最新经历的,Java面试题系列之线程的三道题

硬核线程,每次出去面试都会遇到!

一、为什么wait、notify/notifyall是在Object而不是Thread中

1.wait和 notify是Java中两个线程之间的通信机制。

对语言设计者而言,如果不能通过synchronized实现通信此机制,
同时又要确保这个机制对每个对象可用, 那么Object类则是的正确声明位置

2.每个对象都可上锁,这是在Object类而不是Thread类中声明wait和notify的另一个原因。

3.在Java中为了进入代码的临界区,线程需要锁定并等待锁定,他们不知道哪些线程持有锁,
而只是知道锁被某个线程持有,并且他们应该等待取得锁,而不是去了解哪个线程在同步块内,并请求它们释放锁定。

4.Java是基于Hoare的监视器的思想。所有对象都有一个监视器。
线程在监视器上等待为执行等待,我们需要2个参数:
一个线程,一个监视器(任何对象)
在Java设计中,线程不能被指定,它总是运行当前代码的线程。
但是我们可以指定监视器(这是我们称之为等待的对象)
第一次面试中遇到,一脸懵逼

二、ReetrantLock和synchronized的区别和原理?

区别在这里:
在这里插入图片描述
原理分别是:
Synchronized原理:
Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。

ReenTrantLock实现的原理:
CAS+CLH队列来实现。它支持公平锁和非公平锁,两者的实现类似。
CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。该操作是一个原子操作,被广泛的应用在Java的底层实现中。在Java中,CAS主要是由sun.misc.Unsafe这个类通过JNI调用CPU底层指令实现。
CLH队列:带头结点的双向非循环链表
ReentrantLock实现的前提就是AbstractQueuedSynchronizer,简称AQS,是java.util.concurrent的核心,CountDownLatch、FutureTask、Semaphore、ReentrantLock等都有一个内部类是这个抽象类的子类。先用两张表格介绍一下AQS。第一个讲的是Node,由于AQS是基于FIFO队列的实现,因此必然存在一个个节点,Node就是一个节点。
面试了这么多家,几乎必问了

三、聊聊Java中的CAS算法?

CAS的全称是 Compare-and-Swap,也就是比较并交换,是并发编程中一种常用的算法。设计并发算法时常用到的一种技术,java.util.concurrent 包全完建立在CAS之上,没有CAS也就没有此包,可见CAS的重要性。当前的处理器基本都支持CAS,只不过不同的厂家的实现不一样罢了。
在这里插入图片描述
CAS 有三个参数:V,A,B。内存值 V、旧的预期值 A、要修改的值 B,当且仅当预期值 A 和内存值 V 相同时,将内存值修改为 B 并返回 true,否则什么都不做并返回 false。CAS指令执行时,当且仅当V的值等于预期值A时,才会将V的值设为B。在多线程的情况下,当多个线程同时使用CAS操作一个变量时,只有一个会成功并更新值,其余线程均会失败,但失败的线程不会被挂起,而是不断的再次循环重试。正是基于这样的原理,CAS即使没有使用锁,也能发现其它线程对当前线程的干扰,从而进行及时的处理。可见CAS 其实是一个乐观锁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7rnUoWx-1583249643739)(http://img5.imgtn.bdimg.com/it/u=1691253704,997728285&fm=11&gp=0.jpg)]
CAS操作大概有如下几步:
1.读取旧值为一个临时变量
2.对旧值的临时变量进行操作或者依赖旧值临时变量进行一些操作
3.判断旧值临时变量是不是等于旧值,等于则没被修改,那么新值写入;
不等于则被修改,此时放弃或者从步骤1重试。
CAS 看起来很给力

《零学IT》持续更新,这次疫情,远程面试,问的都很广泛,
起码我遇到的,希望大家都能有个好的工作!
奥利给,给个关注和转发吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值