Day03_JUC面试题

本节内容不过是对尚硅谷面试题第二季(多线程篇)的补充罢了,一切都是围绕着尚硅谷面试题第二季(多线程篇)来

文章目录

1、懒汉式为什么要加volatile关键字?

public class Singleton5 {
   
    private Singleton5(){
   }
    
     /**
     * 为什么要用volatile修饰?
     * 因为下面的new Singleton5()在底层是分三步执行的,其中第二步是初始化对象,第三步是设置instance指向的内存地址,
     * 第二步和第三步没有先后顺序,一旦先执行第三步,后执行第二步,就危险了,怎么危险呢?
     * 就是执行完第三步设置instance指向的内存地址后突然来了个线程,这个线程执行if(instance == null){时得到instance不为空,就把这个instance返回了,但是其实这个instance第二步初始化对象还没有执行完呢
     * 而被volatile修饰的遍历会严格按照三步顺序执行
     */
    private volatile static Singleton5 instance;
    
    public static Singleton5 getInstance(){
   
    	//提高效率
        if(instance == null){
   
			//增加同步锁
            synchronized (Singleton5.class){
   
            	//双端验证(为什么使用双端校验?查看“尚硅谷面试题第二季”)
                if(instance == null){
   
                    //这个new Singleton5()其实分三步执行:①分配对象内存空间②初始化对象③设置instance指向刚分配的内存地址,此时instance!=null
                    instance = new Singleton5();
                }
            }
        }
        return instance;
    }
}

1.说说sychronized的理解

synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行
另外,在 Java 早期版本中,synchronized 属于 重量级锁,效率低下。

为什么呢?

因为监视器锁(monitor)是依赖于底层的操作系统的,如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高。

庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6 对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。

所以,你会发现目前的话,不论是各种开源框架还是 JDK 源码都大量使用了 synchronized 关键字。

1.说说自己是怎么使用 synchronized 关键字

修饰代码块、修饰静态方法、修饰实例方法

在这里插入图片描述

1.构造方法可以使用 synchronized 关键字修饰么?

先说结论:构造方法不能使用 synchronized 关键字修饰。

构造方法本身就属于线程安全的,不存在同步的构造方法一说。

1.说说synchronized的实现原理

synchronized 同步语句块的实现使用的是 monitorentermonitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。

当执行 monitorenter 指令时,线程试图获取锁也就是获取monitor 的持有权。(在 Java 中,每个对象都隐式包含一个monitor对象监视器)

在执行 monitorexit 指令后,线程试图释放锁也就是释放monitor 的持有权


①提问:那线程是如何获取对象监视器 monitor 的持有权的?

在执行monit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlackTurn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值