一、概述:
1、spring单例通过设置属性scope="Singleton"完成(默认),其概念和java中的单例概念一致,如在web应用中,每次请求使用的是同一个实例对象。但spring的单例仅限制在其上下文环境中,并没有限制你通过其他方式去创建此对象的其他实例。说白了是spring帮你完成模拟的单例创建,使用。
2、Spring中的单例和设计模式中的单例思想是一样的,不过它不需要编程来实现单例,而是由容器来配置是否单例。即消除了程序性单例
二、传统的单例模式的实现方式
1. 最原始的实现单例模式的方法(存在线程不安全):
public class SingletonOne {
private static SingletonOne instance = null;
private SingletonOne() {}
public static SingletonOne getInstance() {
if (instance == null) {
instance = new SingletonOne();
}
return instance;
}
}
但是这种方法有一个弊端,就是存在线程的不安全!
比如当两个线程同时进入if(instance == null)时,一个线程判断了当前为空,然后切换到另一个线程,这个线程也判断为空。然后切换回第一个线程,进行实例化,再切换到第二个线程,进行实例化。这样就存在了两个实例。
2. 通过关键字Synchronized强制线程同步
package com.something.singleton;
public class SingletonTwo {
private static SingletonTwo instance = null;
private SingletonTwo() {}
public static synchronized SingletonTwo getInstance() {
if (instance == null)