单例模式(Java)

单例模式(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乱序,但是会牺牲一些内存

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值