title: 【学习之路】设计模式(单列模式)
draft: true
tags:
- 学习之路
- 设计模式
categories: - 设计模式
- 创建型模式
cover: ‘https://cdn.jsdelivr.net/gh/CodeZixuan/Blog_Images/设计模式/单列模式/bg.jpg‘
description: 单列模式学习,如何写一个线程安全的单列
abbrlink: bfb5dc4e
date: 2021-03-27 16:02:30
什么是单列模式
单列就如同名字一样,只有一个实列。全局最多只有一个实列存在,如果存在多个那么就不叫单列模式了
实现单列模式的条件
- 静态变量
- 静态方法
- 私有化构造方法
线程安全饿汉模式
public class Singleton{
private static Singeton singeton = new Singeton;
private Singleton(){}
public static Singleton getInstance(){
return singeton;
}
}
线程不安全懒汉式
public class Singleton{
private static Singleton siglenton;
private Singleton(){}
public static Singleton getInstance(){
if (siglenton == null){
siglenton = new Singleton;
}
return siglenton;
}
}
加上synchronized关键字懒汉式
public class Singleton{
private static Singleton siglenton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if (siglenton == null){
siglenton = new Singleton();
}
}
}
这个方法虽然线程安全但是会损失许多性能
双重检查加锁
public static Singleton{
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if (singleton == null){
// 在这里加只有第一次访问才会生效,如果已经有对象那么直接返回即可
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton;
}
}
}
return singleton
}
}
使用volatile禁止指令重排序
synchronized当第一次访问的时候才会加锁