ACE_TAO 010 单例模式(Singleton设计模式)
Posted islinyoubiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACE_TAO 010 单例模式(Singleton设计模式)相关的知识,希望对你有一定的参考价值。
单例模式的核心是一个类在其整个生命周期中只有一个实例对象。
目的:
想要确保任何情况下都绝对只有1个实例,需要程序表现上“只存在一个实例”
注意:
这个模式在多线程下面使用的时候可能会线程不安全产生多个实例,使用的时候需要特别小心。
Main.java
package com.company;
public class Main
public static void main(String[] args)
// write your code here
System.out.println("开始");
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
if(singleton1 == singleton2)
System.out.println("两个对象相等,是同一个实例对象");
else
System.out.println("两个对象不同,不是同一个实例对象");
Singleton,java
package com.company;
public class Singleton
private static Singleton singleton = new Singleton();
private Singleton()
System.out.println("生成一个实例");
public static Singleton getInstance()
return singleton;
运行结果:
多线程下
Main.java
package com.world.singleton.two;
public class Main extends Thread
public static void main(String[] args)
System.out.println("开始");
new Main("A").start();
new Main("B").start();
new Main("C").start();
new Main("D").start();
new Main("E").start();
System.out.println("结束");
public void run()
Singleton singleton = Singleton.getInstance();
System.out.println(getName()+": obj = " + singleton);
public Main(String name)
super(name);
Singleton.java
package com.world.singleton.two;
public class Singleton
private static Singleton singleton = null;
private Singleton()
System.out.println("singleton实例化");
slowdown();
public static Singleton getInstance()
if(singleton == null)
singleton = new Singleton();
return singleton;
private void slowdown()
try
Thread.sleep(100);
catch(Exception e)
运行结果:
可见,不是要的结果。
改造成Singleton多线程安全模式
1。修改获取实例的方法,将其设置成线程安全模式:
public synchronized static Singleton getInstance();
2。在设置静态成员变量singleton的时候直接给它赋初始值。为什么这种方式可以实现线程安全?因为在程序需要用到这个类的时候会先去加载初始化这个类,按照类的初始化原则,这个时候的静态成员变量在加载初始化类的时候就会被创建分配好内存,初始化好数据。因为只会产生一个实例。
多谢,亲爱的美美。
以上是关于ACE_TAO 010 单例模式(Singleton设计模式)的主要内容,如果未能解决你的问题,请参考以下文章
csharp C# - 简单的SerialPort单例类|示例:https://heiswayi.github.io/2016/csharp-simple-serialport-singleton-c