JUC面试题(持续更新中...)

面试官:谈谈你对死锁的看法?

面试者:死锁就是两个或以上线程在请求共享资源时形成的一种互相等待的场景,这种情况下没有外力参与下将会永远等待,这些线程被称为死锁线程。
死锁产生有四个条件:一是互斥条件;二是循环等待条件;三是请求与保持条件;四是不可剥夺条件;
除了互斥条件这一条件外,要解决死锁,可人工手动破除其他三个条件的任意一种。

面试官:并行和并发的区别?

面试者:并行是同一时刻在不同空间同时运行多个线程,并行是同一时间在同一空间间隔运行多个线程。

面试官:指令重排序了解吗,说一说你对它的理解?

面试者:指令重排序是指虚拟机在编译代码是自动在不影响代码运行结果的情况下改变代码运行的顺序。

面试官:说说自己是怎么使用synchronized关键字的,在项目中用到了吗?

面试者:synchronized关键字用于解决多线程场景下共享资源的同步性问题,使用了synchronized关键字修饰后任何时刻都只允许一个线程使用该资源;平时可能会用到该关键字修饰静态方法和代码块,修饰实例方法,分别锁的是类和实例对象

面试官:Lock和synchronized的区别?

面试者:synchronized是Java当中的关键字,Lock是Java中的一个类;synchronized在资源使用完后会自动释放锁,lock需要手动加锁,手动放锁。

面试官:ConcurrentHashMap底层具体实现知道吗,实现原理是什么?

面试者:ConcorrentHashMap也是由数组,单向链表,红黑树组成的,当数组的长度大于64,单向链表的长度大于等于8时单向链表将会转换为红黑树;ConcurrentHashMap使用方法与HashMap类似,但是它提供了线程安全的保障,它内部是采用了分段锁的一个思想,在JDK1.7及之前,它锁的粒度是比较大的,它将多个节点分为一个段,就相当于一个ConcurrentHahMap被分为了多个HashTable,在不同的段进行操作时就可以实现并发,1.8后,ConcurrentHahMap的锁粒度变得更细了,一个entry就有一个锁,并发场景下更高效;

面试官:ConcurrntHashMap能存null吗,理由?

面试者:是为了解决一个歧义问题,当某高官操作获取这个key时,返回值给的是null,这时不能判断到底是不存在这个key返回null还是这个key本身就为null。

面试官:ConcurrentHashMap的size()方法是线程安全的吗?

面试者:ConcurrentHashMap源码中的size方法并没有使用synchronized关键字修饰,也并有任何手动加锁操作,所以就意味着在使用size方法时,有可能同时进行着其他操作,所以查询到的数量并不一定是当前大小;ConcurrentHashMap设计本身的目的是为了保证操作的并发安全,对数量的统计的实时一致性并不是ConcurrentHahMap的主要目标。

面试官:能谈一下CAS机制吗?

面试者:CAS是乐观锁的一种具体实现,它的意思是比较并交换,这种机制的实现主要就在于三个值,当前值,旧的预期值和将要修改的值,当当前值等于旧的预期值时就执行修改操作,把当前值修改为将要修改的值,反之,修改失败,并自旋尝试再次获得锁;但是CAS它有可能发生一种ABA的问题。

面试官:CAS机制存在什么问题?

面试者:CAS有可能发生一种ABA问题,就是在A线程修改这个值时,读到当前值是A,实际上这个A有可能是被改为了B之后在被改回A的,但是A线程并不知道它被修改过,这就是ABA问题,结果不会受影响,java中采用增加当前标志与预期标志两个属性来解决,也可以采用加版本号来解决;
CAS自旋对CPU带来的性能开销是比较大的,所以当cas自旋过久时会带来较大的性能开销;
CAS只能保证一个共享变量的原子性操作。

面试官:什么是读写锁?

面试者:读写锁就是在写线程持有锁时,其他任何读写线程都会被阻塞,在读线程持有锁时,所有读线程可以进入临界区执行使用资源,写线程被阻塞。(读并行,写串行)

面试官:请说一下ReentrantLock的实现原理?

面试官:ReentrantLock是如何实现锁的公平与非公平性的?

面试官:什么是悲观锁,什么是乐观锁?

面试者:悲观锁是以最悲观的态度来看待竞争共享资源的情况,只要线程来操作资源就会上锁,在此期间其他任何线程都不能操作这个共享资源,乐观锁是认为在操作这个资源时,没有其他线程会来竞争这个资源,乐观锁并没有加锁,是判断预修改值是否发生变化来决定操作失败与否。

面试官:什么是可重入,什么是可重入锁,它用来解决什么问题?

面试官:关于Synchronized锁的原理和锁膨胀的过程?

面试者:synchronized是Java中的一个关键字,实现的是一个悲观的非公平锁,它通常修饰在类上,静态方法和实例方法上,实际上就是给类或对象加锁,使得多线程场景下此共享资源在任意时刻都只能被一个线程所访问,其他的线程都会被阻塞或自旋重复尝试取得锁;锁膨胀原理,在只有一个线程使用这个资源的时候,此时synchronized就是一个偏向锁,当这个线程来就给它锁,当有两个或以上线程来请求这个资源的但线程是交替获得锁,没有发生竞争的时候,它就会升级成轻量级锁;在轻量级锁的前提下,产生了竞争,线程就会自旋来多次尝试获得锁,此时就升级为了自旋锁;当同时请求的线程很多了,自旋会带来大量的cpu消耗,此时得不到锁的线程就会被添加到阻塞队列,这样就不会占用CPU资源。

面试官:说说你对CopyOnWriteArrayList的理解。

面试者:CopyOnWriteArrayList是一个线程安全的线性列表,它的所有写操作都是单独将列表复制一份在进行写操作,读操作就在原列表上进行;CopyOnWriteArrayList大大提高了读操作的并发性并保证了线程安全,但是在写操作比较多时有较大的内存消耗并且并不能保证数据的实时一致性。

面试官:谈谈你对AQS的理解?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值