• 线程常见面试题回答


    1. ReentrantLock 与 synchronized有什么区别?

    1.ReentrantLock:是一个类、有公平和非公平两种所类型、采用AQS实现锁机制、通过尝试获取2机制(trylock)灵活、需要手动释放锁(unlock)、可重入锁;

    2.synchronnized:是一个关键字、只有公平锁、采用操作系统实现monitor、采用线程抢占模式获取锁、自动释放锁、可重入锁。


    2. sleep()和wait()有什么区别?

    1、这两个方法来自不同的类分别是Thread(sleep)和Object(wait)

    2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。


    3. 乐观锁和悲观锁是什么?

    1.乐观锁:形容的是认为在读操作进行时不会有写操作的锁;所以在乐观锁持有资源时不会对读取上锁,但是乐观锁在进行写入操作的时候会判断当前数据是否被修改过;所以乐观锁比悲观锁资源吞吐量大。

    Java中的 StampedLockAtomicInteger是一种乐观锁思想的实现。(读的时候允许写)

    2.悲观锁:形容的是认为在读的时候,会有写的操作;所以悲观锁在持有资源时不会允许别的线程对资源修改;只有等悲观锁释放资源时才可被修改;所以资源吞吐量相交乐观锁小。

    Java 中的 StampedLockAtomicInteger是一种乐观锁思想的实现。
    4. 详细说一下sychronized如何实现的?锁升级的过程了解吗?

    sychronized:是基于字节码的moitor实现的相关实现比较复杂;

    1. 3: monitorenter //进入同步方法
    2. //..........省略其他
    3. 15: monitorexit //退出同步方法
    4. 16: goto 24
    5. //省略其他.......
    6. 21: monitorexit //退出同步方法

    由图可看出是通过monitorenter进入同步区在通过monitorenter离开同步区,当线程进入该同步区时,他的mointor进入计数器会+1,且允许相同线程的重复进入,当重复进入时计数器+1;当其他线程想要获取锁时,mointor会阻塞;只有当上一个线程执行到mointorexit时,此时它会释放锁,并经mointor的计数器设置为0,以便别的线程获取该1mointeor。

    锁升级:偏斜锁、轻量级锁、重量级锁(操作系统维持重量级锁需要付出性能代价,所以在不需要重量级锁的条件下使用锁升级机制,也是为了提高系统的资源利率)

    当只有一个线程长期的访问时此时只会维持偏斜锁

    当有其他线程访问时偏斜锁就会升级为轻量级锁

    当有线程并发情况时则会升级为重量级锁
    5. 产生死锁的四个条件是什么?

    1 : 资源互斥:锁在同一时刻只能被一个线程获取;

    2 : 不可释放:当线程在资源未使用完之前不会释放资源;

    3 : 请求等待 :线程在获得一个资源时,在等待另外一个资源时不会释放原有资源;

    4 : 循环等待 :多个线程相互等待;

    解决方案:

    1:每次占用不超过一个锁

    2:按照相同的顺序使用锁

    3:使用信号量

  • 相关阅读:
    Opencv项目实战:09 物体尺寸测量
    39. 干货系列从零用Rust编写负载均衡及代理,正则及格式替换
    finereport开发者需要关注的问题
    Scanner例题讲解
    Java基础常见知识&面试题总结(下)
    (原创)安卓Compose相关资料汇集
    MyBatis-Flex学习手册
    Unity 从0开始编写一个技能编辑器_01_分析需求
    Mybatis的Xml映射文件
    过滤器和监听器
  • 原文地址:https://blog.csdn.net/m0_66971047/article/details/126874003