剑指offer——2.实现Singleton模式

mac2024-11-01  12

知识点:

进程与线程

volatile关键字:在我们的多线程开发中,我们用Volatile关键字来限定某个变量或者属性时,线程在每次使用变量的时候,都会读取变量修改后的最新的值,即Volatile关键字保证了变量的可见性;https://blog.csdn.net/kris1025/article/details/80008885

java语法中有一个函数能够确保只调用一次,静态构造函数

 synchronized(XXX.class)会阻塞后面返回相同class的synchronized(XXX.class)代码

静态字段通过类来访问,最好不要通过实例

内部类就相当于一个外部类的成员变量,所以可以直接访问外部变量,外部类不能直接访问内部类变量,必须通过创建内部类实例的方法访问

代码实现:

同步锁+两次判断:可以解决多线程问题,缺点是代码较复杂 class A { //定义静态变量,用于存储唯一的对象 private static volatile A instance = null; //定义静态构造方法 private A() { } //定义一个public方法,让其调用静态构造方法产生对象 public static A getInstance() { if (instance == null) { //加锁,一个一个执行 synchronized (A.class) { if (instance == null) instance = new A(); } } return instance; } }  初始化实例对象,可以解决多线程问题,代码简洁,缺点是调用B类,就会创建对象,内存使用率不高 class B{ //初始化对象 private static B uniqueinstance = new B(); //定义静态构造方法 private B() { } //定义一个public方法,让其调用静态构造方法产生对象 public static B getInstance() { return uniqueinstance; } } 静态内部类,在上个方法的基础上解决了内存使用率使用不高的缺点 class D { private D(){ } //定义一个公共方法,通过调用内部类来访问属性 public static D getInstance() { return DInner.uniqueinstance; } //定义一个静态内部类,类中将对象存为属性 private static class DInner{ private static final D uniqueinstance = new D(); } }

 

最新回复(0)