本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、介绍
-
保证类在内存中,只有一个对象
-
举例:
- Windows任务管理器
- 回收站
- 网站的计数器对象:例如点赞
二、饿汉式:
1. 私有化构造方法 2. 定义一个 public static final 修饰的常量,常量值就是对象 3. 在外界直接调用这个常量
写法一:
代码示例
public class Single {
//1.私有化构造方法 --- 不让别人创建对象
private Single(){}
// 非常饿, 上来就要吃, 上来不看任何条件, 直接创建对象
//2.在本类中,自己创建对象
public static final Single s = new Single();
}
写法二、
- 私有化构造方法
- 定义一个 private static final 修饰的常量,常量值就是对象
- 再定义一个getInstance方法
- 在外界直接调用方法即可 代码示例:
public class Single {
//1.私有化构造方法 --- 不让别人创建对象
private Single(){}
//把这个变量定义为私有
private static final Single s = new Single();
public static Single getInstance() {
return s;
}
}
三、懒汉式
写法一:弊端:多线程操作的时候,很有可能会创建出多个对象
public class Single {
private Single(){}
// 懒汉式
// 核心:延迟加载
private static Single s;
public static Single getInstance() {
if(s == null){
s = new Single();
}
return s ;
}
}
写法二、添加同步代码块
public class Single {
private Single(){}
private static Single s ;
public static Single getInstance() {
synchronized (Single.class) {
if(s == null){
s = new Single();
}
}
}
return s ;
}
}
写法三: 会进行判断当前是否创建了对象,如果没创建过对象,就进行加锁
public class Single {
private Single(){}
private static Single s ;
public static Single getInstance() {
// 如果现在对象已经有了,而且,锁关闭了
// 为了提高代码的效率,所以,我们要在外面,再加一个非空判断
if(s == null){ // 作用:提高效率
synchronized (Single.class) {
if(s == null){ // 作用:保证唯一
s = new Single();
}
}
}
return s ;
}
}
推荐饿汉式、、和懒汉式第三种写法。