开篇介绍面试
你们好,公众号【Java极客思惟】近期会整理一些Java高频面试题分享给小伙伴,也但愿看到的小伙伴在找工做过程当中可以用获得!本章节主要针对Java一些多线程高频面试题进行分享。微信
Q1:多线程
乐观锁 和 悲观锁并发
乐观锁:性能
乐观锁(Optimistic Locking)实际上是一种思想。相对悲观锁而言,乐观锁假设认为数据通常状况下不会形成冲突,所在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,若是发现冲突了,则让返回用户错误的信息,让用户决定如何去作。this
悲观锁:spa
Java在JDK1.5以前都是靠 synchronized 关键字保证同步的,这种经过使用一致的锁定协议来协调对共享状态的访问,能够确保不管哪一个线程持有共享变量的锁,都采用独占的方式来访问这些变量。独占锁就是一种悲观锁,因此能够说:synchronized是悲观锁 。线程
Q2:设计
synchronized内置锁对象
用处:
synchronized做为线程同步的关键字,设计到锁的概念,Java内置锁是一个互斥锁,这就说明最多只有一个线程可以得到该锁,例如线程A 和 线程B,若是线程A尝试去得到线程B的内置锁,则线程A必须等待或者阻塞,直到线程B释放这个锁为止;若是线程B永不释放这个锁,那么线程A将永远处于等待或者阻塞状态。Java的对象锁和类锁在锁的概念上,与内置锁几乎是一致的,可是对象锁和类锁的区别是很是大的。
对象锁:
用synchronized关键字修饰非静态方法、用synchronized(this)做为同步代码块,用synchronized(非this对象)的用法,锁的是对象,线程想要执行对应的同步代码,须要先得到对象锁。
类锁:
用synchronized修饰静态方法、用synchronized(类.class)的用法,锁的是类,线程想要执行对应的同步代码,须要先得到对象锁。
对象锁:锁的是类的对象实例;
类锁:锁的是每一个类的Class对象,每一个类的Class对象在虚拟机中只有一个,因此类锁也只有一个。
Q3:
乐观锁必定就是好的吗?
乐观锁避免了悲观锁独占对象的现象,同时也提升了并发性能,可是也有如下几个缺点:
1. 乐观锁只能保证一个共享变量的原子操做。若是多一个或者几个变量,乐观锁将变得力不从心;
(但互斥锁能轻易解决,无论对象数量多少以及对象颗粒度大小。)
2. 长时间自旋可能致使开销大。假如CAS长时间不成功就会一直自旋,会给CPU带来很是巨大的开销
3. ABA问题。CAS的核心思想是经过对比内存值与预期值是否一致而判断内存值是否被改动过,但这个判断逻辑不够严谨,例如:假如A同窗倒了一杯水放桌子上,而后有事去忙,此时B同窗通过,看到桌子上的水,而后喝了半杯,喝完后再将水打满,实际看起来仍是一杯水,可是这杯水已经不是A同窗的那一杯水了,且实际上水是已经被B同窗改过了,这种状况对依赖过程值的情景的运算结果影响很大。
解决的方案:经过引入版本号,每次变量更新都把版本号加1.
Q4:
线程池的启动策略?
线程池的执行过程.png
2. 当调用 execute() 方法添加一个任务时,线程池会作以下判断:
明天,会介绍多线程一些深刻的知识,长按二维码关注我吧~
祝你们都能拿到心仪的offer!
若是以为文章不错,欢迎关注、点赞、收藏,大家的支持是我创做的动力,感谢你们。
若是文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。
若是你还想更加深刻的了解我,能够微信搜索「Java极客思惟」进行关注。天天8:00准时推送技术文章,让你的上班路不在孤独,并且每个月还有送书活动,助你提高硬实力!