经历过java面试的小伙伴都知道,java面试是考核你对java知识的掌握程度,并且会考核全部java内容,因此我们想顺利用过java面试,还是需要用心学,那java面试中有哪些锁?下面来我们就来给大家讲解一下。
Java锁有以下几种:
1.公平锁 / 非公平锁
2.可重入锁 / 不可重入锁
3.独享锁 / 共享锁
4.互斥锁 / 读写锁
5.乐观锁 / 悲观锁
6.分段锁
7.偏向锁 / 轻量级锁 / 重量级锁
8.自旋锁
Java锁面试题有哪些?
1.乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
乐观锁,每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止;
悲观锁是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
乐观锁可以使用volatile+CAS原语实现,带参数版本来避免ABA问题,在读取和替换的时候进行判定版本是否一致;
悲观锁可以使用synchronize的以及Lock;
2.Synchronized有哪些缺点?
只有一个condition与锁相关联,这个condition是什么?就是synchronized对针对的对象锁。
synchronized无法中断一个正在等待获得锁的线程,也即多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断。这种情况对于大量的竞争线程会造成性能的下降等后果。
3.我们面对ReentrantLock和synchronized改如何选择?
Synchronized相比Lock,为许多开发人员所熟悉,并且简洁紧凑,如果现有程序已经使用了内置锁,那么尽量保持代码风格统一,尽量不引入Lock,避免两种机制混用,容易令人困惑,也容易发生错误。在Synchronized无法满足需求的情况下,Lock可以作为一种高级工具,这些功能包括“可定时的、可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁”否则还是优先使用Synchronized。
最后,未来更可能提升Synchronized而不是Lock的性能,因为Synchronized是JVM的内置属性,他能执行一些优化,例如对线程封闭的锁对象的锁消除优化,通过增加锁的粒度来消除内置锁的同步,而如果基于类库的锁来实现这些功能,则可能性不大。
4.Lock锁和synchronized锁的区别是什么?
Lock锁是对象,而synchronized是java关键字;
Lock锁需要手动加锁释放锁,synchronized的该操作是全自动的。对于异常前者需要手动释放锁,不然容易导致死锁。而后者由jvm自动管理。
Lock锁的属性可以配置,而synchronized只能是可重入的、非公平的、不可中断的。
在实现原理上synchronized主要是基于对象的monitor。而Lock的实现是java层面的,基础是AQS;
Java锁是java重要知识点,也是java面试中必考的问题,如果我们想要顺利通过java面试,关于java锁相关知识点以及面试题一定要多看多做,加深印象!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。
推荐阅读: