今天我们来说说一个非常常用的模式,单例模式,单例模式让某个类中有自己的实例,而且只实例化一次,避免重复实例化,单例模式让某个类提供了全局唯一访问点,如果某个类被其他对象频繁使用,就可以考虑单例模式,以下用代码来分析:
饿汉式单例模式举例:
/*
* 饿汉式单例模式
* 饿汉式的这种单例模式是线程安全的
* 需要根据业务需求来觉得要不要使用饿汉式单例模式
*/
public class SingletonHungry {
/*
* 直接以变量的形式实例化了当前对象,并进行了私有化,(这种方式的话在不管被不被使用,就已经实例化)
*/
private static SingletonHungry singletonHungry = new SingletonHungry();
public static SingletonHungry getInstance() {
return singletonHungry;
}
public void printlnMethod() {
System.out.println("线程安全的饿汉式单例模式...");
}
}
懒汉式单例模式
// 懒汉式单例模式
// 懒汉式的这种单例模式是线程不安全的,因为多线程并发性调用就会引发线程不安全问题
// 需要根据业务需求来觉得要不要使用懒汉式单例模式
public class SingletonLazy {
/*
* 首先申明一个对象变量,变量都是必须私有化
*/
private static SingletonLazy singletonLazy = null;
public static SingletonLazy getInstance() {
if (null == singletonLazy) {
singletonLazy = new SingletonLazy();
}
return singletonLazy;
}
public void printlnMethod() {
System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全");
}
}
以上的懒汉式单例模式,有不足之处,所以以下这个案例就是解决多线程并发调用引发的不安全问题:
/*
* 之前提到的懒汉式单例模式,存在多线程并发调用引发线程不安全问题,现在就增加同步来解决这个问题
*/
public class SingletonUpdate {
private static SingletonUpdate singletonUpdate = null;
public static SingletonUpdate getInstance() {
if (null == singletonUpdate) {
synchronized (SingletonUpdate.class) {
if (null == singletonUpdate) {
singletonUpdate = new SingletonUpdate();
}
}
}
return singletonUpdate;
}
public void printlnMethod() {
System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全
这个是Update升级版....");
}
测试程序:
// 测试程序
public class Main {
public static void main(String[] args) {
SingletonHungry.getInstance().printlnMethod();
SingletonLazy.getInstance().printlnMethod();
SingletonUpdate.getInstance().printlnMethod();
}
}
运行结果:
单例模式还有很多种实现方式,只是列举了普遍的三种给大家分享!!!
例如我在举例一种:
静态内部类单例模式:
/*
* 内部静态类 单例模式
*/
public class SingletonState {
public SingletonState() {
// TODO Auto-generated constructor stub
}
private static class SingletonClass {
public static SingletonState singletonState = new SingletonState();
}
public static SingletonState getNewInstance() {
return SingletonClass.singletonState;
}
public void printlnMethod() {
System.out.println("内部静态类 单例模式...");
}
}
还有枚举方式的,….. 省略 , 就不写了, 谢谢大家观看!!!!!!!!
谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006