轻松掌握Java单例模式_java

单例模式是23中设计模式中最简单的设计模式,在企业开发中也应用的特别多。单例模式的优点是:项目中有且仅有一个实例。

特点:构造器私有化,对象私有化,只提供一个对外访问的接口。

应用场景:

    1、系统需要共享资源:比如日志系统,spring的资源管理器等

    2、为了控制资源的使用:比如线程池

企业级开发和常见框架中的常见应用:

    J2EE中的servlet,Spring中的资源管理器(即beans),数据库连接池,线程池,日志系统,网站计数器等

单例模式分类:

1、饿汉模式:饿汉模式是代码最简单的单例模式,但实例在类初始化的时候就加载了,在不是即时使用的情况下,会加慢系统的加载速度,具体代码如下:

public class Singleton{
 private static Singleton instance = new Singleton();

 private Singleton(){}

 public static Singleton getInstance(){
 return instance;
 }
}

2、懒汉模式:懒汉模式相比于饿汉模式,就是在实例化的放在了唯一的对外接口中处理,实现了延迟加载,节省了系统初始化时间,但存在线程不安全的情况。

public class Singleton{
 private static Singleton instance = null;

 private Singleton(){}

 public static Singleton getInstance(){
 if(instance == null){
  return new Singleton();
 }
 return instance;
 }
}

3、双重校验锁:双重校验锁模式其实就是懒汉模式的升级,让懒汉模式变得线程安全。注意:双重校验锁存在内存问题,可能让双重校验锁失效。

public class Singleton{
 private static Singleton instance = null;

 private Singleton(){}

 public static Singleton getInstance(){
 if(instance == null){
  synchronized(Singleton.class){
  if(instance == null){
   return new Singleton();
  }
  }
 }
 return instance;
 }
}

4、静态内部类模式:静态内部类兼具了懒汉模式和恶汉模式的有点:线程安全,延迟加载。

public class Singleton{
 private static class SingletonFactory{
 private static Singleton INSTANCE = new Singleton();
 }

 private Singleton(){}

 public static Singleton getInstance(){
 return SingletonFactory.INSTANCE;
 }
}

5、枚举类模式:应该是最完美的单利模式,不仅线程安全,而且还能防止反序列和反射问题。

enum Singleton{
 INSTANCE;

 public void doSomething(){
 ...
 }
}

单例模式细节化问题:

1、反射打破单例模式:通过反射可以破坏单例模式的实现(枚举类模式除外)   

/**
 *通过反射破坏单例模式
 */
public class Demo01 {

 public static void main(String[] args) throws Exception {
 Singleton s1 = Singleton.getInstance();
 Singleton s2 = Singleton.getInstance();

 System.out.println(s1 == s2);

 Class<Singleton> clazz = (Class<Singleton>) Class.forName("com.singleton.Singleton");
 Constructor<Singleton> constructor = clazz.getDeclaredConstructor(null);
 constructor.setAccessible(true);
 Singleton s3 = constructor.newInstance();

 System.out.println(s1 == s3);
 }
}

class Singleton{
 private static Singleton instance = new Singleton();

 private Singleton(){
 //防止反射破坏单利模式的方法,打开注释部分
// if(instance != null){
//  throw new RuntimeException();
// }
 }

 public static Singleton getInstance(){
 return instance;
 }
}

其实所谓的防止也就是让其不能通过反射创建。

2、反序列化打破单例模式(枚举类模式除外)

/**
 * 反序列化打破单例模式
 */
public class Demo02 {

 public static void main(String[] args) throws Exception {
 Singleton s1 = Singleton.getInstance();
 Singleton s2 = Singleton.getInstance();

 System.out.println(s1 == s2);

 FileOutputStream fos = new FileOutputStream("d://test.txt");
 ObjectOutputStream oos = new ObjectOutputStream(fos);
 oos.writeObject(s1);

 oos.close();
 fos.close();

 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d://test.txt"));
 Singleton s3 = (Singleton) ois.readObject();

 System.out.println(s1 == s3);
 }
}
class Singleton implements Serializable{
 private static Singleton instance = new Singleton();

 public static Singleton getInstance(){
 return instance;
 }

 //反序列化时,如果对象已经存在,将调用这个方法
// private Object readResolve() throws ObjectStreamException{
// return instance;
//
// }
}

这两种情况仅限于了解,在实际开发过程中用的不多。

至此,单例模式完整。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
单例模式
30天轻松掌握javaweb、轻松掌握javaweb视频、java单例模式、java单例模式例子、java单例模式的作用,以便于您获取更多的相关知识。

时间: 2024-09-29 17:35:06

轻松掌握Java单例模式_java的相关文章

轻松掌握Java观察者模式_java

定义:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象. 特点:     1.观察者和被观察者是抽象耦合的.     2.建立一套触发机制. 企业级开发和常用框架中的应用:Java自带观察者类,servlet中的filter,分布式的消息队列 实例: public class Demo { public static void main(String[] args) { ActualSubject subject

java设计优化之单例模式_java

单例模式是一种对象创建模式,确保系统中一个类只有一个实例. 在java语言中,这样做有两大好处: 1.对于频繁使用的对象,可以省略创建对象所话费的时间: 2.由于new操作的次数减少,对于系统内存的使用频率降低,这样减少GC的压力,缩短GC停顿的时间. 单例模式细分: 1. public class Singleton{ private Singleton(){ System.out.println("Singleton.Singleton()"); } private static

Java单例模式实例简述_java

本文实例讲述了Java的单例模式,是Java程序设计中非常重要的概念.分享给大家供大家参考.具体分析如下: 所谓单子模式就是在整个应用过程中只向外界提供唯一的一份实例,也就是说在应用时只有一个实例,这样也就不用反反复复的创建实例了.那么根据他的要求,看下面一个最简单的单例模式的代码: public class Singleton { private static Singleton single = new Singleton(); private Singleton(){ } public s

实例解析Java单例模式编程中对抽象工厂模式的运用_java

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别        抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的

Java单例模式、饥饿模式代码实例_java

class MyThreadScopeData {       // 单例     private MyThreadScopeData() {     }       // 提供获取实例方法     public static synchronized MyThreadScopeData getThreadInstance() {         // 从当前线程范围内数据集中获取实例对象         MyThreadScopeData instance = map.get();      

Java 单例模式的实现资料整理_java

Java单例模式的实现,对java 单例模式的几种实现方法进行了整理: 单例模式好多书上都是这么写的: public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return insta

Java单例模式实现的几种方式_java

Java单例模式实现的几种方式 单例模式好多书上都是这么写的: public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return instance; } } 但是实际开发中是不会这

java多线程之线程安全的单例模式_java

概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

调试-java单例模式传参问题

问题描述 java单例模式传参问题 用sshexec连接linux ConnBean connInfo = new ConnBean(remoteAddress, userName, password); SSHExec sshExec = SSHExec.getInstance(connInfo); 假设每次传过来的conninfo参数是变的,但是debug查看每次都是第一次的参数. private static SSHExec ssh; public static SSHExec getIn