JAVA面试-并发编程中的锁

本文深入探讨了Java并发编程中的锁机制,重点讲解了Synchronized的原理,包括其可重入性、JVM优化及非公平性。同时,介绍了ReentrantLock与Synchronized的区别,如性能、功能和实现方式,并提到了AQS框架。还讨论了Java线程池的实现和线程同步工具,如CountDownLatch和CyclicBarrier,以及内存模型和volatile关键字的作用。
摘要由CSDN通过智能技术生成

Synchronized相关问题

问题一,Synchronized用过吗,其原理是什么

Synchronized是由jvm实现的保持线程互斥的一种方式,底层字节码被编译成monitorenter和monitorexit两个指令,在遇到monitorenter时,会把对象的锁计数器+1.代表这个已经获取到了锁,在monitorexit将锁计数器-1 代表释放锁

 问题二:你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁?

这个锁就是一个Refrence对象,也就是要加锁或者解锁的对象,关于确定锁对象有几种情况

1.如果指明了所对象如:Synchronized(this) 则对this对象进行加锁

2.如果直接在方法上添加Synchronized,则锁定的是该方法所在对象

3.如果是对静态方法使用Synchronized,则是对静态方法所对应的类对象加锁

对一个对象加锁不影响对该对象其他方法的使用

 问题三:什么是可重入性,为什么说 Synchronized 是可重入锁?

 重入性就是在一个同步方法中调用另一个同步方法,主要是为了防止自己把自己锁死的情况发生,如下代码

public class Test{
    public synchronized void method1() {}
    public synchronized void method2() {
        this.method1();
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.method2();
    }
}

 如果Synchronized不具备重入性,则运行method2的时候就会将自己锁死,jvm对于重入锁的操作也很简单,在执行 monitorenter 指令时,如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁(而不是已拥有了锁则不能继续获取),就把锁的计数器 +1,其实本质上就通过这种方式实现了可重入性

 问题四:JVM 对 Java 的原生锁做了哪些优化?

在jdk6之后,出现了自旋锁,减少了从用户态到内核态切换的开销

偏向锁

轻量级锁

重量级锁

当没有竞争出现的时候,jvm默认使用偏向锁,将对象的mark word部分设置线程ID,标识当前对象偏向当前线程

如果有一个线程试图获取锁定某个被偏向的锁,jvm则会撤销偏向锁,从而使用轻量级锁,轻量级锁使用CAS来进行将自己的线程ID设置到对象的mark word 

如果轻量级锁设置markword对象失败,则切换为重量级锁

 问题五:为什么说 Synchronized 是非公平锁?

 非公平是指在获取锁的行为上,并不是按照线程申请顺序进行分配的,当锁被释放后,所有线程都有机会获取到锁,这样提高了性能,但是可能会出现某些线程饥饿的情况

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值