<commit_before>---
layout: post
author: ruirui
titile: Java学习总结-单例模式
category: 学习笔记
tag: [Java]
---
目标：

* 设计一个类，只能生成该类的一个实例
* 单例模式

关键点：

* 一个类只有一个实例，这是最基本的
* 它必须自行创建这个实例
* 它必须自行向整个系统提供这个实例

实现方式

* 懒汉模式（类加载时不初始化）
* 饿汉模式（在类加载时就完成了初始化）

###懒汉式单例模式
懒汉模式代码如下：

{% highlight java %}
package Singleton;

public class LazySingleton {
    //懒汉式单例模式
    //比较懒，在类加载时，不创建实例，因此类加载速度快，但运行时获取对象的速度慢
    
    
    private static LazySingleton intance = null;//静态私用成员，没有初始化
    
    private LazySingleton()
    {
        //私有构造函数
    }
    
    public static synchronized LazySingleton getInstance()    //静态，同步，公开访问点
    {
        if(intance == null)
        {
            intance = new LazySingleton();
        }
        return intance;
    }
}
{% endhighlight %}

关键点：（代码注释上已给出）

* 构造函数定义为私有---不能在别的类中来获取该类的对象，只能在类自身中得到自己的对象
* 成员变量为static的，没有初始化---类加载快，但访问类的唯一实例慢，static保证在自身类中获取自身对象
* 公开访问点getInstance：public和synchronized的---public保证对外公开，synchronized同步保证多线程时的正确性（因为类变量不是在加载时初始化的）

<!-- more -->

###饿汉式单例模式
饿汉式单例模式代码如下

{% highlight java%}
package Singleton;

public class EagerSingleton {
    //饿汉单例模式
    //在类加载时就完成了初始化，所以类加载较慢，但获取对象的速度快
    
    private static EagerSingleton instance = new EagerSingleton();//静态私有成员，已初始化
    
    private EagerSingleton() 
    {
        //私有构造函数
    }
    
    public static EagerSingleton getInstance()    //静态，不用同步（类加载时已初始化，不会有多线程的问题）
    {
        return instance;
    }
    
    
}
{% endhighlight %}

关键点：（代码注释上已给出）

* 构造函数定义为私有---不能在别的类中来获取该类的对象，只能在类自身中得到自己的对象
* 静态私有成员--在类加载时已初始化
* 公开访问点getInstance-----不需要同步，因为在类加载时已经初始化完毕，也不需要判断null，直接返回

<commit_msg>commit information<commit_after>---
layout: post
author: ruirui
titile: Java学习总结-单例模式
category: 学习笔记
tag: [Java]
---
目标：

* 设计一个类，只能生成该类的一个实例
* 单例模式

关键点：

* 一个类只有一个实例，这是最基本的
* 它必须自行创建这个实例
* 它必须自行向整个系统提供这个实例

实现方式

* 懒汉模式（类加载时不初始化）
* 饿汉模式（在类加载时就完成了初始化）

###懒汉式单例模式
懒汉模式代码如下：

{% highlight java %}
package Singleton;

public class LazySingleton {
    //懒汉式单例模式
    //比较懒，在类加载时，不创建实例，因此类加载速度快，但运行时获取对象的速度慢
    
    
    private static LazySingleton intance = null;//静态私用成员，没有初始化
    
    private LazySingleton()
    {
        //私有构造函数
    }
    
    public static synchronized LazySingleton getInstance()    //静态，同步，公开访问点
    {
        if(intance == null)
        {
            intance = new LazySingleton();
        }
        return intance;
    }
}
{% endhighlight %}

关键点：（代码注释上已给出）

* 构造函数定义为私有---不能在别的类中来获取该类的对象，只能在类自身中得到自己的对象
* 成员变量为static的，没有初始化---类加载快，但访问类的唯一实例慢，static保证在自身类中获取自身对象
* 公开访问点getInstance：public和synchronized的---public保证对外公开，synchronized同步保证多线程时的正确性（因为类变量不是在加载时初始化的）

<!-- more -->

###饿汉式单例模式
饿汉式单例模式代码如下

{% highlight java%}
package singleton;

public class Singleton1 {

	//饿汉单例模式
	//类加载时就完成了初始化，所以类加载比较慢，但是获取对象的速度快
	
	//静态私有成员，已初始化
	private static final Singleton1 instance =new Singleton1();
	private Singleton1(){
		//私有构造函数
	}
	public static Singleton1 getInstance(){
		return instance;   //静态，不用同步（类加载时已初始化，不会有多线程的问题）
	}
	
	

}
{% endhighlight %}

关键点：（代码注释上已给出）

* 构造函数定义为私有---不能在别的类中来获取该类的对象，只能在类自身中得到自己的对象
* 静态私有成员--在类加载时已初始化
* 公开访问点getInstance-----不需要同步，因为在类加载时已经初始化完毕，也不需要判断null，直接返回


{'fraction_non_alphanumeric': 0.11537222043184016, 'fraction_numerical': 0.0016113438607798904, 'mean_word_length': 3.287292817679558, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1448649', 'n_tokens_mistral': 1830, 'n_tokens_neox': 2026, 'n_words': 185}