单例设计模式我这里就只写五种方式进行实现
1、饿汉模式
饿汉模式天生线程安全。因为一开始就创建了对象
步骤:
1、一开始就使用static 方法创建自己
2、将构造函数私有
3、对外提供一个方法获取到自己
/**
* 单例模式创建方式一: 饿汉模式创建
*
* @author liyue
* @date 2020/2/12 15:44
*/
public class User {
//1.一开始就创建对象
public static User user = new User();
//2.私有化构造方法
private User() {
}
//3.提供一个对外的可以获取当前对象的方法
public static User getUser() {
return user;
}
}
2、懒汉模式
创建步骤:
-
一开始只使用static 定义自己
-
构造方法私有
-
对外提供一个可以获取到对象的接口,如果该对象为null就重新new一个对象返回。如果对象不为
null就放当前对象。
/**
* 单例模式创建方式二: 懒汉模式
*
* @author liyue
* @date 2020/2/12 15:50
*/
public class User {
//1.开始只定义自己
private static User user;
//2.构造方法私有化
private User() {
}
//3.对外提供一个可以获取到对象的方法
public static User getUser() {
//多线程访问的时候会线程不安全
if (user == null) {
user = new User();
return user;
}
return user;
}
}
3、加锁的懒汉模式
package com.leeue.sigle;
/**
* 单例模式创建方式三: 线程安全加锁的 懒汉模式
*
* @author liyue
* @date 2020/2/12 17:14
*/
public class User {
private static User user;
private User() {
}
// 加了 synchronized 锁 就可以保证只有一个线程进行访问。
public static synchronized User getUser() {
if (user == null) {
user = new User();
return user;
}
return user;
}
}
4、懒汉模式双重校验锁方式实现
/**
* 单例模式创建方式四: 双重校验锁饿汉模式
*
* @author liyue
* @date 2020/2/12 17:17
*/
public class User {
//加上volatile 关键字,user就对线程有了可见性
private static volatile User user;
private User() {
}
public static User getUser() {
if (user == null) {
//使用 synchronized 包裹代码块。双重判断。static 修饰的锁是字节码文件
synchronized (User.class) {
if (user == null) {
user = new User();
return user;
}
}
}
return user;
}
}
5、使用枚举方式实现单例
在java中枚举是天生安全的
/**
* 单例模式创建方式五: 使用枚举方式创建实现单例模式
*
* @author liyue
* @date 2020/2/12 17:27
*/
public class User {
//1.定义枚举里面复制创建对象
private static enum UserEnum {
GET_USER;
private User user;
private UserEnum() {
user = new User();
}
public User getUser() {
return user;
}
}
//2.私有构造方法
private User() {
}
//3.提供一个对外获取对象的方法
private static User getUser() {
return UserEnum.GET_USER.getUser();
}
}