单例模式
单例模式属于创建型类型,单例模式强调的是只有单个对象被创建。
1、分类
单例模式分为两类:懒汉模式和饿汉模式;如果说这两者的区别可以简单概括为 “按需所得”;就内存方面,需要时加载避免了内存的消耗。(作者认为两者使用还得视实际情况而定)
2、安全
只要实际要使用的软件都逃不掉安全;单例模式也不例外,只要在多线程的环境下,我们就得考虑线程安全问题;常见解决线程安全的措施:加锁、枚举、无状态类等
3、用例
3.1、 饿汉模式之线程安全的
示例1:
public class singleton{
private static final singleton instance=new singleton();
//私有的构造函数
private singleton(){
}
//静态方法得到实例
public static singleton getInstance(){
return instance;
}
}
示例2:
public class singleton{
private static final singleton instance;
//私有的构造函数
private singleton(){
}
//静态块
static{
instance=new singleton();
}
//静态方法得到实例
public static singleton getInstance(){
return instance;
}
}
为什么这两个示例线程安全,这主要是由jvm决定。
懒汉模式
示例1之线程非安全的
public class singleton{
private static singleton instance;
//私有的构造函数
private singleton(){
}
//静态方法得到实例
public static singleton getInstance(){
if(instance==null){
instance=new singleton();
}
return instance;
}
示例2之线程安全
public class singleton{
private static singleton instance;
//私有的构造函数
private singleton(){
}
//静态方法得到实例
public synchronized static singleton getInstance(){
if(instance==null){
instance=new singleton();
}
return instance;
}
public class singleton{
private static volatile singleton instance;
//私有的构造函数
private singleton(){
}
//静态方法得到实例
public static singleton getInstance(){
if(instance==null){
synchronized(singleton.class){
instance=new singleton();
}
}
return instance;
}
double check
public class singleton06 {
private static volatile singleton06 instance ;
private singleton06() {
}
public static singleton06 getInstance() {
if(instance==null){
synchronized (singleton06.class) {
if(instance==null)
instance = new singleton06();
}
System.out.println("懒汉模式的线程安全");
}
return instance;
}
}
静态内部类
public class singleton07 {
private singleton07() {
}
private static class single{
private static final singleton07 instance =new singleton07();
}
public static synchronized singleton07 getInstance() {
return single.instance;
}
}
枚举
public enum Single {
INSTANCE;
public void getInstance(){
System.out.println("s");
}
}
public class singleton08 {
public static void main(String[] args) {
Single.INSTANCE.getInstance();
}
}
以上大致就是单例模式的八种写法。具体如何使用得需要依实际情况而定。注单例模式的侧重点是线程安全。
4 问题引申
问题引申旨在让读者不要停留在其表面上,要从现象窥探本质;深刻理解其技术理论。
- 1、JVM的类加载机制(类加载过程和类加载器)
- 2、Java的内存模型(JMM)和多线程的线程安全。
- 3、关于单例模式在spring中的应用。
- 4、单例模式和原型模式的区别
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。