面试官:写一下双重检测单例模式,解释一下每一行,volatile的作用,不加会有什么问题,去掉第一层循环会有什么问题,去掉第二层循环会有什么问题。

简介: 面试官:写一下双重检测单例模式,解释一下每一行,volatile的作用,不加会有什么问题,去掉第一层循环会有什么问题,去掉第二层循环会有什么问题。

写一下双重检测单例模式(小意思):

1. public class Test {
2. private static volatile Test test;
3. private Test(){}
4. public Test getSingleTan(){
5. if (test==null){
6. synchronized (Test.class){
7. if(test==null){
8.                     test = new Test();
9.                 }
10. return test;
11.             }
12.         }
13. return test;
14.     }
15. }

解释一下每一行

private static volatile Test test;   //创建一个静态可见性的对象

private Test(){}                    //构造函数私有话,不让外部创建对象

public Test getSingleTan(){

   if (test==null){                //检查test是否被初始化

       synchronized (Test.class){    //对Test.class 加锁进行初始化 ,当然这个可能会有多个线程走到这再次获得锁

           if(test==null){          //防止上边多个线程获得锁之后多次初始化,

               test = new Test();  //创建单例对象

           }

           return test;

       }

   }

   return test;                 //创建之后返回

}

volatile的作用

因为volatile修饰的变量具有可见性和有序性,我们创建单例模式是在多个线程返回的同一个单例对象,这个volatile修饰,就是当创建成功之后其他西安城也能及时看到就不再创建单例对象。

 

不加会有什么问题

不加就会创建单例对象被覆盖,如果之前创建好兵器赋了相应的值,就会被覆盖掉。

 

去掉第一层循环会有什么问题

之所以第一层在,就是为了当已经创建过单例对象就不用再去获取锁,减少了去尝试获取锁的过程减少了时间的消耗,所以如果去掉这个就会比不去掉耗时较多。

 

去掉第二层循环会有什么问题

第二层循环就是为了防止多个线程同时进入第一层循环,如果进入第一层循环的有三个线程,第一个线程获取锁创建对象之后其他两个获取锁之后也不能在创建对象了,如果把第二层去掉之后就会创建3个对象,也就破坏了单例模式的概念。

 

 

兴致比较高再写一个静态内部类的单例模式

为什么静态内部类能做单例模式? 因为静态内部类只会加载一次

1. class Test{    
2. public Test getSingleTan() {
3. return T.test1;
4.     }
5. 
6. static class T{
7. private static volatile Test test1=new Test();
8.     }
9. }

 

相关文章
|
1月前
|
存储 缓存 Java
大厂面试高频:Volatile 的实现原理 ( 图文详解 )
本文详解Volatile的实现原理(大厂面试高频,建议收藏),涵盖Java内存模型、可见性和有序性,以及Volatile的工作机制和源码案例。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Volatile 的实现原理 ( 图文详解 )
|
2月前
|
C语言
经典面试题:嵌入式系统中经常要用到无限循环,怎么样用C编写死循环呢
在嵌入式系统开发中,无限循环常用于持续运行特定任务或监听事件。使用C语言实现死循环很简单,可以通过`while(1)`或`for(;;)`的结构来编写。例如:`while (1) { /* 循环体代码 */ }`,这种写法明确简洁,适用于需要持续执行的任务或等待中断的场景。
|
4月前
|
缓存 安全 Java
面试官:说说volatile应用和实现原理?
面试官:说说volatile应用和实现原理?
48 1
|
4月前
|
缓存 Java
【多线程面试题二十三】、 说说你对读写锁的了解volatile关键字有什么用?
这篇文章讨论了Java中的`volatile`关键字,解释了它如何保证变量的可见性和禁止指令重排,以及它不能保证复合操作的原子性。
|
5月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
66 6
|
4月前
|
搜索推荐 大数据 数据处理
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
54 0
|
4月前
|
缓存 Java 编译器
一文搞懂volatile面试题
这篇文章是关于Java关键字volatile的详细介绍和分析,volatile是多线程访问共享变量时保证一致性的方案,性能优于synchronized,但不保证操作原子性,需要同步处理。
|
5月前
|
缓存 安全 Java
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
81 4
|
5月前
|
存储 缓存 安全
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
38 0
|
5月前
|
设计模式 安全 Java
Java面试题:什么是单例模式?如何在Java中实现单例模式?
Java面试题:什么是单例模式?如何在Java中实现单例模式?
68 0