
嗨,亲爱的先生们,钱Ju,我要回去更新大家,如果有人关注我的发展,我应该知道我在一年前发出了一个标志,我想在新年假期. 完成后,结果已经在三月份. 我还没有完成写作,看来我确实是一位合格的鸽子[手动狗头]
如今,我一直在思考如何编写这些设计模式单例模式 singleton,因为互联网上关于设计模式的轮子过多,我们一直在倡导使用轮子,不要重复创建轮子,尽管有很多设计模式教程,但是钱Ju认为互联网上写的那些东西太麻烦了,因此他考虑重新创建轮子.
Singleton模式,属于创建类型的常见软件设计模式. 通过单例模式方法创建的类在当前进程中只有一个实例(根据需要,线程也可能属于单例,例如: 程上下文中仅使用同一实例)
成千上万的Jue对单例模式的理解是,通过单例模式创建的类在应用程序中一次只能有一个实例
我们什么时候使用单例模式(例如应用程序中的配置文件类),如果您有多个实例,则整个应用程序中一次只能有一个实例,如果需要的话,在更改配置类时,很容易例外. (不要问钱据鹅为什么他知道,它是如此伤心地说了吧)

下面,我们将探讨制作单例的几种方法.
public class Singleton {
//创建一个静态实例
private static Singleton singleton;
//限制随意创建单例模式
private Singleton(){}
//给出一个公共的静态方法返回一个单例
public static Singleton getInstance(){
//只有实例为空的时候才创建实例
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
在并发的情况下,上述写入方法不考虑标准单例模式. 一旦放置在具有并发请求的程序中,上述程序将具有多个实例,这不是单例模式.
给你一个并发的例子进行测试,以防止你们中的某些人问钱爵,为什么并发请求中它不是单例模式,钱Qian是你对我们说谎. 前爵是个不会撒谎的好人[狗头]
为什么要在并发时立即创建多个实例,因为在并发访问期间一个线程在创建实例之前会先引入另一个线程. 此时,尚未创建该实例,并再次对其进行判断. 此时,由于尚未创建前一个线程,因此该线程还会创建一个实例,因此导致多个实例将以这种单例模式出现的原因.

为了解决这种情况,我们认为最简单的形式应为以下形式.
public class SynchroizedSingleton {
private static SynchroizedSingleton singleton;
private SynchroizedSingleton(){}
public synchronized static SynchroizedSingleton getInstance(){
if(singleton == null){
singleton = new SynchroizedSingleton();
}
return singleton;
}
}
上面的代码可以在并发应用程序中使用,但是这种效率太慢了. 当一个线程访问此方法时,所有其他线程都处于等待状态.
我们可以优化上面的类. 只要尚未创建单例实例,在创建实例之后,就无需同步获取实例的方法,因此可以将以上代码优化为以下外观.
public class SynchroizedSingleton {
private volatile static SynchroizedSingleton singleton;
private SynchroizedSingleton(){}
public static SynchroizedSingleton getInstance(){
if(singleton == null){
synchronized(SynchroizedSingleton.class){
if(singleton == null){
singleton = new SynchroizedSingleton();
}
}
}
return singleton;
}
}

上面的代码是许多书籍中的标准双锁. 为什么需要判断同步块中的实例是否为空单例模式 singleton,因为如果创建了一个线程且该实例已准备好返回,那么这次是另一个线程进来,如果在同步块中没有判断,则有多个实例将被创建,为什么要添加volatile?因为创建好实例后应立即将此实例写入主存储器. 如果您不编写它,那么同步块中的判断也会失去效果.
如果您不知道volatile关键字的含义,可以给我留言. 如果人数很多,我将写一篇介绍volatile的文章. 记得跟着我.
饥饿的单身人士
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
上面的代码是最简单的单例模式,但是Qian Jue不建议您使用此方法. 这种方法的缺点是,如果我曾经使用此类的静态方法,但是我们不打算使用此示例,则会浪费内存.

另一种方法是使用内部类
public class Singleton {
private Singleton(){}
public static Singleton getInstance(){
return SingletonInstance.singleton;
}
private static class SingletonInstance{
static Singleton singleton = new Singleton();
}
}
上面是使用静态内部类作为单例,为什么上面的单例也是可能的,因为静态变量仅初始化一次,所以单例仍然是单例.
以上是编写单例模式的基本方法. 如果有遗漏,请在下面添加. 钱Ju首先感谢我.
这次引入的单例模式可能存在一些问题. 麻烦不要喷洒千壶. 毕竟,前觉是Java学习道路上的新手.
感谢您的观看.
在下一期中,我们将在设计模式下介绍工厂模式. 如果您有兴趣,请给我们一个大拇指和关注. 也欢迎您来微信找我. 微信搜索jue.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-283488-1.html
最后面的那个手势和表情