java单例模式 不封装_JAVA封装学习笔记3--单例模式

为什么80%的码农都做不了架构师?>>>

6936d1565ae689371725cdb5fc51c415.png

单例模式(singleton):

一个类只有一个实例。(比如提高数据库的访问效率)

两种:  饿汉    懒汉

如何保证类只有一个实例?如何让外部类不能new---把构造方法搞成私有的。如下:

public class Singleton{

private Singleton(){

}

public static Singleton getInstance(){//得到实例

return new Singleton();

}

}

那么这样真的能保证只有一个实例?

Singleton s1 = Singleton.getInstance();

Singleton s1 = Singleton.getInstance();

很显然s1,s2不是同一个Singleton.

那么究竟应该怎么做?看下面的代码:

public class Singleton{

private Singleton(){

}

private static Singleton singleton =  new Singleton();

public static Singleton getInstance(){//得到实例

return singleton;

}

}

这样一来,显然就只能一个了,每次调用Instrance代码,都返回静态singleton。

这种方法叫做饿汉式。下面还要讲一种叫做懒汉式的单例模式。

首先看下面代码:

public class Singleton{

private Singleton(){

}

private static Singleton singleton =  null;

public static Singleton getInstance(){//得到实例

if(singleton == null){

singleton = new Singleton();

}

return singleton;

}

}

首先声明static singleton为空,在使用的时候在创建,这种方式叫做懒汉式。在这里,需要注意线程安全问题。

如果多线程需要访问实例,当多个线程调用Instance()方法时可能出现创建两个实例,等等问题。此处,我们要加一个线程锁synchronized。如下:

public class Singleton{

private Singleton(){

}

private static Singleton singleton =  null;

public synchronized static Singleton getInstance(){//得到实例

if(singleton == null){

singleton = new Singleton();

}

return singleton;

}

}

注意:

在多个JVM系统的分散式系统中

在一个JVM中有多个类加载器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值