当前位置:   article > 正文

面试 Java 并发编程八股文十问十答第七期_java并发编程面试

java并发编程面试

面试 Java 并发编程八股文十问十答第七期

作者:程序员小白条个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)什么是 CAS

CAS(Compare and Swap)是一种原子操作,用于实现并发编程中的无锁算法。它通过比较内存中的值与预期值是否相等,如果相等则将新值写入内存,否则不做任何操作。CAS操作通常用于解决多线程环境下的并发冲突问题。

2)CAS 的会产生什么问题?

CAS操作虽然能够解决多线程并发冲突的问题,但也存在一些问题。首先,CAS操作是基于内存值的比较和替换,如果在比较和替换之间有其他线程修改了内存值,CAS操作可能会失败,需要重新尝试。这种情况下,CAS操作的性能会下降。其次,CAS操作只能保证一个共享变量的原子性,对于多个共享变量的操作需要额外的控制手段。最后,CAS操作可能会出现ABA问题,即在CAS操作期间,共享变量的值从A变为B,再变回A,导致CAS操作无法感知到变化,可能会产生意外结果。

3)什么是死锁?

死锁是指两个或多个线程在互相等待对方释放资源的情况下,无法继续执行的状态。在死锁状态下,每个线程都在等待其他线程释放资源,导致所有线程都无法继续执行下去。死锁通常发生在多线程环境下,当多个线程持有某些资源并试图获取其他线程持有的资源时,可能会出现循环等待的情况,从而导致死锁的发生。死锁是并发编程中常见的问题,需要合理地设计和管理资源的使用,避免出现死锁情况。

4)产生死锁的条件通常有以下四个:

  • 互斥条件:资源只能被一个线程占用,其他线程需要等待释放。
  • 请求与保持条件:线程在持有资源的同时请求其他资源。
  • 不可剥夺条件:已经分配给线程的资源不能被其他线程强制性地剥夺。
  • 循环等待条件:存在一个资源的循环等待链,每个线程都在等待下一个线程所持有的资源。

为了防止死锁的发生,可以采取以下几种策略:

  • 避免死锁:通过破坏死锁产生的四个条件之一来避免死锁的发生,如避免循环等待、按序申请资源等。
  • 检测死锁:通过算法检测系统是否进入死锁状态,一旦检测到死锁,可以采取相应的措施进行恢复。
  • 避免死锁:通过预防措施,如资源分配策略、资源动态分配等,使系统在运行时不会进入死锁状态。
  • 解除死锁:一旦检测到死锁,通过抢占资源、回滚进程等方式解除死锁。

5)死锁和活锁都是多线程并发编程中的问题,但有一些区别:

  • 死锁是指线程在互相等待对方释放资源的情况下无法继续执行的状态,而活锁是指线程在不断地改变自己的状态,但仍无法继续执行的状态。
  • 死锁是一种静止状态,线程无法继续执行,而活锁是一种动态状态,线程不断尝试重新执行,但始终无法取得进展。
  • 死锁是由于资源的互斥和循环等待导致的,而活锁通常是由于线程的调度问题或者竞争条件导致的。

死锁和饥饿也有一些区别:

  • 死锁是指线程之间相互等待资源导致无法继续执行,而饥饿是指某个线程无法获得所需的资源而无法执行。
  • 死锁是多个线程相互等待资源的情况,而饥饿是某个线程无法获得资源被其他线程占用导致无法执行。
  • 死锁是由于资源分配不当导致的,而饥饿是由于资源分配不公平或优先级不当导致的。

6)多线程锁的升级原理是为了提高并发性能,一般分为两种升级策略:偏向锁和轻量级锁。

  • 偏向锁:当只有一个线程访问同步块时,JVM会将对象头中的标记设置为偏向锁,并将线程ID记录在对象头中。这样,在后续访问时,无需再进行同步操作,提高了性能。
  • 轻量级锁:当有多个线程竞争同步块时,JVM会将对象头中的标记设置为轻量级锁,并尝试使用CAS操作来获取锁。如果成功获取锁,则继续执行同步块;如果获取失败,则升级为重量级锁。
  • 重量级锁:当多个线程竞争同步块时,JVM会将对象头中的标记设置为重量级锁,并将竞争锁的线程置于阻塞状态。这样,其他线程无法进入同步块,直到持有锁的线程释放锁。

通过锁的升级策略,JVM可以根据线程竞争情况动态地选择适合的锁,提高并发性能。锁的升级过程是为了权衡锁的粒度和性能,以提供更好的并发控制。

7)AQS 介绍

AQS(AbstractQueuedSynchronizer)是Java并发包中的一个基础框架,用于实现同步器的开发。它提供了一种简单且灵活的方式来构建各种同步器,如锁、信号量、倒计时门栓等。AQS通过内部的FIFO队列(等待队列)和状态变量来管理线程的等待和唤醒,实现了线程的排队和互斥访问。

8)AQS 原理分析

AQS的原理分析如下:

  • AQS内部维护了一个同步状态变量,通过CAS操作来实现对状态的修改和判断。
  • 当线程需要获取锁或资源时,如果当前状态不满足条件,线程会被加入到等待队列中并进入阻塞状态。
  • 当前持有锁或资源的线程释放锁或资源时,会唤醒等待队列中的一个线程,使其继续执行。
  • 等待队列中的线程在被唤醒后会再次尝试获取锁或资源,如果成功获取则继续执行,否则重新进入阻塞状态。

9)AQS定义两种资源共享方式

AQS定义了两种资源共享方式:

  • 独占模式(Exclusive):只有一个线程可以持有锁或资源,其他线程需要等待释放后才能获取。
  • 共享模式(Shared):多个线程可以同时持有锁或资源,但需要满足特定条件才能获取。

10)ReentrantLock(重入锁)实现原理与公平锁非公平锁区别什么?

ReentrantLock(重入锁)是基于AQS实现的一种独占模式的锁。它的实现原理是通过将线程ID和重入次数记录在AQS的状态变量中,来实现线程的重入和可重入性。ReentrantLock可以实现公平锁和非公平锁两种方式:

  • 公平锁:按照线程的申请顺序来获取锁,保证所有线程公平竞争锁的机会。
  • 非公平锁:不保证线程申请锁的顺序,允许线程插队获取锁,可能会导致某些线程一直无法获取到锁(饥饿现象)。
    公平锁的实现会导致更多的线程上下文切换和调度开销,而非公平锁的性能可能更好,但可能会产生线程饥饿的问题。根据具体的场景和需求,可以选择适合的锁类型。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 800+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/808864
推荐阅读
相关标签
  

闽ICP备14008679号