懒汉式参考:http://blog.csdn.net/haitaofeiyang/article/details/44124375
没有使用单例模式:
package java_basic; class Singleton{ public Singleton(){ } public void print(){ System.out.println("Hello Word"); } } public class singleton { public static void main(String[] args) { // TODO 自动生成的方法存根 Singleton s1 = new Singleton(); Singleton s2 = new Singleton(); Singleton s3 = new Singleton(); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); s1.print(); s2.print(); s3.print(); } }
单例设计模式:
1):饿汉式:(一定是安全的,只有一份对象)
1.构造器私有化
2.声明私有的静态属性,同时创建该对象
3.对外提供访问属性的静态方法,确保该对象存在。
(1):写法:初始化就加载
package java_basic; class Singleton{ private static Singleton instance = new Singleton(); //声明私有的静态属性,同时创建该对象 private Singleton(){ //构造函数私有化 } public static Singleton getInstance(){ //对外提供访问属性的静态方法,确保该对象存在 return instance; } public void print(){ System.out.println("Hello Word"); } } public class singleton { public static void main(String[] args) { // TODO 自动生成的方法存根 Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); Singleton s3 = Singleton.getInstance(); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); s1.print(); s2.print(); s3.print(); } }
可以看到输出的hashCode只有一个,证明new出的对象是同一个
(2):写法:类在使用的时候加载,延时加载
package java_basic; class Singleton{ //类在使用的时候加载,延时加载 private static class Single{ private static Singleton instance = new Singleton(); //声明私有的静态属性,同时创建该对象 } private Singleton(){ //构造函数私有化 } public static Singleton getInstance(){ //对外提供访问属性的静态方法,确保该对象存在 return Single.instance; } public void print(){ System.out.println("Hello Word"); } } public class singleton { public static void main(String[] args) { // TODO 自动生成的方法存根 Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); Singleton s3 = Singleton.getInstance(); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); s1.print(); s2.print(); s3.print(); } }
单例设计模式:
2):懒汉式:(不一定安全,确保只有一份对象需要synchronized)
1.构造器私有化
2.声明私有的静态属性
3.对外提供访问属性的静态方法,确保该对象存在。
(1):写法,多线程下不安全
package java_basic; class Singleton{ //懒汉模式,多线程下不安全 private static Singleton instance; //声明私有的静态属性,但是不创建该对象 private Singleton(){ //构造函数私有化 } public static Singleton getInstance(){ //对外提供访问属性的静态方法,确保该对象存在 if(instance == null){ instance = new Singleton(); } return instance; } public void print(){ System.out.println("Hello Word"); } } public class singleton { public static void main(String[] args) { // TODO 自动生成的方法存根 Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); Singleton s3 = Singleton.getInstance(); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); s1.print(); s2.print(); s3.print(); } }
(2):写法,加锁
package java_basic; class Singleton{ //懒汉模式,加锁 private static Singleton instance; //声明私有的静态属性,但是不创建该对象 private Singleton(){ //构造函数私有化 } public static Singleton getInstance(){ //对外提供访问属性的静态方法,确保该对象存在 if(instance == null){ synchronized(Singleton.class){//加锁 if(null == instance){ instance = new Singleton(); } } } return instance; } public void print(){ System.out.println("Hello Word"); } } public class singleton { public static void main(String[] args) { // TODO 自动生成的方法存根 Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); Singleton s3 = Singleton.getInstance(); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); s1.print(); s2.print(); s3.print(); } }