单例模式
Posted zhou2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。
/**
* 饿汉式 在类加载时实现初始化,浪费内存
* 线程安全
* 用于访问量大,多线程访问
*
*/
public class Utils{
private static final Utils instanch=new Utils();
private Utils() {
}
public static Utils getInstance (){
return instanch;
}
}
/**
* 懒汉式 在调用时实现初始化
* 非线程安全
* 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象
* eg:线程A,B同时执行到if (instance == null) { 中会有多个实例
*/
public class Utils {
private static Utils instance;
private Utils() {
}
public static Utils getInstance() {
if (instance == null) {
instance = new Utils();
}
return instance;
}
}
/**
* 懒汉式优化(DCL式) 在调用时实现初始化
* 非线程安全
* 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象
* synchronized: 只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。费性能
* 可能存在 获取到空的instance eg:线程A执行到 getInstance 看的第2步(相当于半个对象因已有内存空间)线程B执行getInstance时会直接return instance;一个null对象
优化如下个方法
*/
public class Utils {
private static Utils instance;
private Utils() { //分3步 1 分配内存空间2,初始化对象,3设置内存地址到对象
}
public static Utils getInstance() {
if(instance==null){
synchronized (Utils.class){
if (instance == null) {
instance = new Utils();
}
}
}
return instance;
}
}
/**
* 懒汉式优化(DCL式) 在调用时实现初始化
* 非线程安全
* 用于访问量少,单线程访问,多线程时可能会出现实例化多个对象
* synchronized: 只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。费性能
* volatile :高并发时用volatile
* 使用volatile变量能够保证:
每次读取前必须先从主内存刷新最新的值。
每次写入后必须立即同步回主内存当中。
也就是说,volatile关键字修饰的变量看到的随时是自己的最新值。线程1中对变量v的最新修改,对线程2是可见的
*/
public class Utils {
private volatile static Utils instance;
private Utils() {
}
public static Utils getInstance() {
if(instance==null){
synchronized (Utils.class){
if (instance == null) {
instance = new Utils();
}
}
}
return instance;
}
}
/**
* 使用时加载UtilsInSide 内部类,线程安全
*
*/
public class Utils {
public static Utils getInstance(){
return UtilsInSide.instance;
}
private static class UtilsInSide {
private static final Utils instance=new Utils();
}
}
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章