java实现单例_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java实现单例

java实现单例

 2013/8/1 22:10:25  西北小强  程序员俱乐部  我要评论(0)
  • 摘要:最近工作不是很忙,于是回过头再看看java基础,当时学习单例的时候不太明白为什么要那么写,只是死记硬背老师写的单例的格式,刚把单例常见的两种方式写了一下,顺便做个笔记。在开发过程中推荐使用第二中方法,因为懒汉模式要考虑到线程的同步问题,执行效率要比第二中方法低,当然如果你钟情于第一种也是可以的。1、懒汉模式:在这种模式下,SingletonTest1进入内存的时候,内存中还没有SingletonTest1的对象,只有在程序调用getInstance方法时程序才创建对象。packagecom
  • 标签:实现 Java

最近工作不是很忙,于是回过头再看看java基础,当时学习单例的时候不太明白为什么要那么写,只是死记硬背老师写的单例的格式,刚把单例常见的两种方式写了一下,顺便做个笔记。在开发过程中推荐使用第二中方法,因为懒汉模式要考虑到线程同步问题,执行效率要比第二中方法低,当然如果你钟情于第一种也是可以的。

1、懒汉模式:在这种模式下,SingletonTest1进入内存的时候,内存中还没有SingletonTest1的对象,只有在程序调用getInstance方法时程序才创建对象

class="java">package com.temp;

public class SingletonTest1 {
	/**
	 * 单例之懒汉模式
	 */
	private static SingletonTest1 singleon =null;
	private SingletonTest1(){
	}
	public static synchronized SingletonTest1 getInstance(){
		/*
		 * 此处如果没有synchronized时,可能会引起一下情况,
		 * 如果A线程正在执行此处singleon==null时,
		 * B线程刚好执行到 	singleon = new SingletonTest1();
		 * B线程已经创建了singleton对象,而此时A线程判断 singleton==null 刚好是ture A线程就会再创建一个
		 * singleton对象,这样的话有可能引发程序异常,而我们从代码中却找不到任何问题
		 */
		if(singleon==null){					
			singleon = new SingletonTest1();
		}
		return singleon;
	}
	
	public static void main(String[] args) {
		SingletonTest1 s1=SingletonTest1.getInstance();
		SingletonTest1 s2=SingletonTest1.getInstance();
		SingletonTest1 s3=SingletonTest1.getInstance();
		if(s1==s2&& s2==s3){
			System.out.println("创建的对象相同");
			s1.fun();
		}else{
			System.out.println("创建的对象不同");
		}
	}
	
	public void fun(){
		System.out.println("hello word");
	}
}

?2、饿汉模式:所谓的饿汉模式即不管三七二十一先创建singleton对象。

public class SingletonTest {
	/**
	 * 单例之饿汉模式
	 */
	private static SingletonTest singleon = new SingletonTest();
	private SingletonTest(){
	}
	public static SingletonTest getInstance(){
		return singleon;
	}
	
	public static void main(String[] args) {
		SingletonTest s1=SingletonTest.getInstance();
		SingletonTest s2=SingletonTest.getInstance();
		SingletonTest s3=SingletonTest.getInstance();
		if(s1==s2 && s2==s3){
			System.out.println("创建的对象相同");
			s1.fun();
		}else{
			System.out.println("创建的对象不同");
		}
	}
	public void fun(){
		System.out.println("hello word");
	}
}

?

?

发表评论
用户名: 匿名