1.java中的单例模式的代码怎么写我从我的博客里把我的文章粘贴过来吧,对于单例模式模式应该有比较清楚的解释:单例模式在我们日常的项目中十分常见,当我们在项目中需要一个这样的一个对象,这个对象在内存中只能有一个实例,这时我们就需要用到单例 。
一般说来,单例模式通常有以下几种:1.饥汉式单例 public class Singleton { private Singleton(){}; private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } } 这是最简单的单例,这种单例最常见,也很可靠!它有个唯一的缺点就是无法完成延迟加载——即当系统还没有用到此单例时,单例就会被加载到内存中 。在这里我们可以做个这样的测试:将上述代码修改为:public class Singleton { private Singleton(){ System.out.println("createSingleton"); }; private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } public static void testSingleton(){ System.out.println("CreateString"); } } 而我们在另外一个测试类中对它进行测试(本例所有测试都通过Junit进行测试) public class TestSingleton { @Test public void test(){ Singleton.testSingleton(); } } 输出结果:createSingleton CreateString 我们可以注意到,在这个单例中,即使我们没有使用单例类,它还是被创建出来了,这当然是我们所不愿意看到的,所以也就有了以下一种单例 。
2.懒汉式单例 public class Singleton1 { private Singleton1(){ System.out.println("createSingleton"); } private static Singleton1 instance = null; public static synchronized Singleton1 getInstance(){ return instance==null?new Singleton1():instance; } public static void testSingleton(){ System.out.println("CreateString"); } } 上面的单例获取实例时,是需要加上同步的,如果不加上同步,在多线程的环境中,当线程1完成新建单例操作,而在完成赋值操作之前,线程2就可能判 断instance为空,此时,线程2也将启动新建单例的操作,那么多个就出现了多个实例被新建,也就违反了我们使用单例模式的初衷了 。我们在这里也通过一个测试类,对它进行测试,最后面输出是 CreateString 可以看出,在未使用到单例类时,单例类并不会加载到内存中,只有我们需要使用到他的时候,才会进行实例化 。
这种单例解决了单例的延迟加载,但是由于引入了同步的关键字,因此在多线程的环境下,所需的消耗的时间要远远大于第一种单例 。我们可以通过一段测试代码来说明这个问题 。
public class TestSingleton { @Test public void test(){ long beginTime1 = System.currentTimeMillis(); for(int i=0;i<100000;i++){ Singleton.getInstance(); } System.out.println("单例1花费时间:"+(System.currentTimeMillis()-beginTime1)); long beginTime2 = System.currentTimeMillis(); for(int i=0;i<100000;i++){ Singleton1.getInstance(); } System.out.println("单例2花费时间:"+(System.currentTimeMillis()-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 SingletonHolder.instance; } } 在这个单例中,我们通过静态内部类来托管单例,当这个单例被加载时,不会初始化单例类,只有当getInstance方法被调用的时候,才会去加载 SingletonHolder,从而才会去初始化instance 。
- 夜间模式是什么意思 夜间模式到底有什么用
- 璞玉蕴华光正常模式 璞玉蕴华光攻略
- 关于刷机中的快速启动模式和恢复模式
- 解除安全模式 解除安全模式短信发不出去
- 苹果手机突然没声音了怎么回事显示耳机模式
- 起承转合 起承转合结构模式
- 苹果手机微信暗黑模式怎么设置 苹果手机微信暗黑模式怎么设置不了
- 11b only 11bonly模式好吗
- 鸣人九尾 鸣人九尾模式
- 空调睡眠模式是什么意思 空调睡眠模式是什么意思1234
