关于java:Java面试专题多线程篇2-锁和线程池

29次阅读

共计 1897 个字符,预计需要花费 5 分钟才能阅读完成。

开篇介绍

大家好,公众号【Java 极客思维】近期会整顿一些 Java 高频面试题分享给小伙伴,也心愿看到的小伙伴在找工作过程中可能用失去!本章节次要针对 Java 一些 多线程 高频面试题进行分享。

Q1:

乐观锁 和 乐观锁

乐观锁:

乐观锁(Optimistic Locking)其实是一种思维。绝对乐观锁而言,乐观锁假如认为数据个别状况下不会造成抵触,所在数据进行提交更新的时候,才会正式对数据的抵触与否进行检测,如果发现抵触了,则让返回用户谬误的信息,让用户决定如何去做。

乐观锁:

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

  1. 线程池刚创立时,外面没有一个线程。工作队列是作为参数传进来的。不过就算队列外面有工作,线程池也不会马上执行它们。

2. 当调用 execute() 办法增加一个工作时,线程池会做如下判断:

  • 如果正在运行的线程数量小于 corePoolSize,那么马上创立线程运行这个工作;
  • 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个工作放入队列;
  • 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创立线程运行这个工作;
  • 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异样,告知调用者 ” 我不能再接受任务了 ”。
  1. 当一个线程实现工作时,它会从队列中取下一个工作来执行。
  2. 当一个线程无事可做,超过肯定的工夫(keepAliveTime)时,线程池会进行判断,如果以后运行的线程数大于 corePoolSize,那么这个线程就会被停掉。所以线程池的所有工作实现后,它最终将会膨胀到 corePoolSize 大小。

今天,会介绍多线程一些深刻的常识,长按二维码关注我吧~

祝大家都能拿到心仪的 offer!


点关注、不迷路

如果感觉文章不错,欢送 关注 点赞 珍藏,你们的反对是我创作的能源,感激大家。

如果文章写的有问题,请不要悭吝,欢送留言指出,我会及时核查批改。

如果你还想更加深刻的理解我,能够微信搜寻「Java 极客思维」进行关注。每天 8:00 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

正文完
 0