关于java静态外部类方式的单例形式 (关于javascript的说法错误的有)

关于java静态外部类方式的单例形式 (关于javascript的说法错误的有)

本文目录导航:

关于java静态外部类方式的单例形式

static Singleton instance = new Singleton();

static类型的成员变量,只会在新建类的对象时被口头一次性。

所以static Singleton instance = new Singleton();只要在第一次性调用时,被new一次性。

之后失掉的都是第一次性口头的对象。

所以称之为单例。

也可以经常使用老的写法,比拟明晰一些。

如何写一个便捷的单例形式?

便捷的单例形式如下

[java]view plaincopyprint?

public class Singleton{

private static Singleton unique Instance=null;

private Singleton(){

//Exists only to defeat instantiation.

public static Singleton getInstance(){

if(unique Instance==null){

unique Instance=new Singleton();

return unique Instance;

//Other methods...

单例形式确保某个类只要一个实例,而且自行实例化并向整个系统提供这个实例。

在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。

这些运行都或多或少具备资源治理器的配置。

每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以防止两个打印作业同时输入到打印机中。

每台计算机可以有若干通讯端口,系统应当集中治理这些通讯端口,以防止一个通讯端口同时被两个恳求同时调用。

总之,选用单例形式就是为了防止不分歧形态,防止政出多头。

裁减资料

一、单例形式有以下特点:

1、单例类只能有一个实例。

2、单例类必定自己创立自己的独一实例。

3、单例类必定给一切其余对象提供这一实例。

二、单例形式分三种:懒汉式单例、饿汉式单例、注销式单例三种。

1.饿汉式单例类

[java]view plaincopyprint?

//饿汉式单例类.在类初始化时,曾经自行实例化

public class Singleton1{

//私有的自动结构子

private Singleton1(){}

//曾经自行实例化

private static final Singleton1 single=new Singleton1();

//静态工厂方法

public static Singleton1 getInstance(){

return single;

2.懒汉式单例类

[java]view plaincopyprint?

//懒汉式单例类.在第一次性调用的时刻实例化

public class Singleton2{

//私有的自动结构子

private Singleton2(){}

//留意,这里没有final

private static Singleton2 single=null;

//静态工厂方法

public synchronized static Singleton2 getInstance(){

if(single==null){

single=new Singleton2();

return single;

3.注销式单例类

[java]view plaincopyprint?

//注销式单例类.

//相似Spring外面的方法,将类名注册,下次从外面间接失掉。

public class Singleton3{

private static Map<String,Singleton3>map=new HashMap<String,Singleton3>();

Singleton3 single=new Singleton3();

(()(),single);

//包全的自动结构子

protected Singleton3(){}

//静态工厂方法,返还此类独一的实例

public static Singleton3 getInstance(Stringname){

if(name==null){

(name==null+--->name=+name);

if((name)==null){

(name,(Singleton3)(name)());

}catch(InstantiationExceptione){

}catch(IllegalAccessExceptione){

}catch(ClassNotFoundExceptione){

//一个表示性的商业方法

public String about(){

returnHello,IamRegSingleton.;

public static void main(String[]args){

Singleton3 single3=(null);

参考资料:网络百科——java单例形式

java中的单例形式的代码怎样写

我从我的博客里把我的文章粘贴上来吧,关于单例形式形式应该有比拟清楚的解释:单例形式在咱们日常的名目中十分经常出现,当咱们在名目中须要一个这样的一个对象,这个对象在内存中只能有一个实例,这时咱们就须要用到单例。

普通说来,单例形式理论有以下几种:1.饥汉式单例public class Singleton {private Singleton(){};private static Singleton instance = new Singleton();public static Singleton getInstance(){return instance;}}这是最便捷的单例,这种单例最经常出现,也很牢靠!它有个独一的缺陷就是不可实现提前加载——即当系统还没有用到此单例时,单例就会被加载到内存中。

在这里咱们可以做个这样的测试:将上述代码修正为:public class Singleton {private Singleton(){(createSingleton);};private static Singleton instance = new Singleton();public static Singleton getInstance(){return instance;}public static void testSingleton(){(CreateString);}}而咱们在另外一个测试类中对它启动测试(本例一切测试都经过Junit启动测试)public class TestSingleton {@Testpublic void test(){();}}输入结果:createSingletonCreateString咱们可以留意到,在这个单例中,即使咱们没有经常使用单例类,它还是被创立进去了,这当然是咱们所不情愿看到的,所以也就有了以下一种单例。

2.懒汉式单例public class Singleton1 {private Singleton1(){(createSingleton);}private static Singleton1 instance = null;public static synchronized Singleton1 getInstance(){return instance==null?new Singleton1():instance;}public static void testSingleton(){(CreateString);}}下面的单例失掉实例时,是须要加上同步的,假设不加上同步,在多线程的环境中,当线程1实现新建单例操作,而在实现赋值操作之前,线程2就或者判别instance为空,此时,线程2也将启动新建单例的操作,那么多个就产生了多个实例被新建,也就违犯了咱们经常使用单例形式的初衷了。

咱们在这里也经过一个测试类,对它启动测试,最前面输入是CreateString可以看出,在未经常使用到单例类时,单例类并不会加载到内存中,只要咱们须要经常使用到他的时刻,才会启动实例化。

这种单例处置了单例的提前加载,然而因为引入了同步的主要字,因此在多线程的环境下,所需的消耗的期间要远远大于第一种单例。

咱们可以经过一段测试代码来说明这个疑问。

public class TestSingleton {@Testpublic void test(){long beginTime1 = ();for(int i=0;i<;i++){();}(单例1破费期间:+(()-beginTime1));long beginTime2 = ();for(int i=0;i<;i++){();}(单例2破费期间:+(()-beginTime2));}}最后输入的是:单例1破费期间:0单例2破费期间:10可以看到,经常使用第一种单例耗时0ms,第二种单例耗时10ms,性能上存在显著的差异。

为了经常使用提前加载的配置,而造成单例的性能上存在显著差异,是不是会得失相当呢?能否可以找到一种更好的处置的方法呢?既可以处置提前加载,又不至于性能损耗过多,所以,也就有了第三种单例:3.外部类托管单例public class Singleton2 {private Singleton2(){}private static class SingletonHolder{private static Singleton2 instance=new Singleton2();}private static Singleton2 getInstance(){return ;}}在这个单例中,咱们经过静态外部类来托管单例,当这个单例被加载时,不会初始化单例类,只要当getInstance方法被调用的时刻,才会去加载SingletonHolder,从而才会去初始化instance。

并且,单例的加载是在外部类的加载的时刻实现的,所以天生对线程友好,而且也不须要synchnoized主要字,可以说是兼具了以上的两个好处。

4.总结普通来说,上述的单例曾经基本可以保障在一个系统中只会存在一个实例了,然而,依然或者会有其余的状况,造成系统生成多个单例,请看以下状况:public class Singleton3 implements Serializable{private Singleton3(){}private static class SingletonHolder{private static Singleton3 instance = new Singleton3();}public static Singleton3 getInstance(){return ;}}经过一段代码来测试:@Testpublic void test() throws Exception{Singleton3 s1 = null;Singleton3 s2 = ();//1.将实例串行话到文件FileOutputStream fos = new FileOutputStream();ObjectOutputStream oos =new ObjectOutputStream(fos);(s2);();();//2.从文件中读取出单例FileInputStream fis = new FileInputStream();ObjectInputStream ois = new ObjectInputStream(fis);s1 = (Singleton3) ();if(s1==s2){(同一个实例);}else{(不是同一个实例);}}输入:不是同一个实例可以看到当咱们把单例反序列化后,生成了多个不同的单例类,此时,咱们必定在原来的代码中添加readResolve()函数,来阻止它生成新的单例public class Singleton3 implements Serializable{private Singleton3(){}private static class SingletonHolder{private static Singleton3 instance = new Singleton3();}public static Singleton3 getInstance(){return ;}//阻止生成新的实例public Object readResolve(){return ;}}再次测试时,就可以发现他们生成的是同一个实例了。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读