单例模式(Java)

it2025-04-24  27

单例模式(Java)

下面是关于我所写的所有设计模式代码(还是建议自己手打或者想一个别的例子练习一次) (https://github.com/lihang212010/DesignPatterns-/tree/master/designpatterns/src)

单例模式,保证一个类只能有一个实例对象,并提供访问此对象的方法。 单例模式分为饿汉式和懒汉式。 一般情况下我们多用饿汉式,懒汉式有线程问题使用少于饿汉式

饿汉式

public class Singleton { private Singleton(){} private static Singleton singleton=new Singleton(); public static Singleton getSingleton() { return singleton; } } public class Main { public static void main(String[] args) { Singleton s1=Singleton.getSingleton(); Singleton s2=Singleton.getSingleton(); System.out.print(s1==s2); } }

结果是true. 饿汉式是在加载这个类时就实例化,封闭创造自己对象的构造方法,提供一个外部获得对象的方法 getSingleton。

懒汉式

private Singleton1(){} private static Singleton1 singleton; public static Singleton1 getSingleton() { if(singleton==null) { synchronized (Singleton1.class) { //加锁防止被同步访问 if(singleton==null) { //双重锁保证线程安全 singleton=new Singleton1(); }} } return singleton; } } public class Main { public static void main(String[] args) { Singleton1 s1=Singleton1.getSingleton(); Singleton1 s2=Singleton1.getSingleton(); System.out.print(s1==s2); } }

懒汉式是使用后在实例化对象,因为有可能别2个线程同时访问,这样就会出现2个实例话对象,因此需要加锁,但是因为JVM存在乱序行为,这种写法也不稳定, 可以private volatile static Singleton1 singleton=null;来防止JVM乱序,但是会牺牲一些内存

最新回复(0)