本文共 2605 字,大约阅读时间需要 8 分钟。
什么是单例模式?
确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。通俗一点就是确保一个类只能产生一个对象,所有对象对他的依赖都是相同的。 单例模式的几种实现方式懒汉式(线程不安全)
public class Singleton { private static Singleton singleton; private Singleton (){} public static synchronized Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton (){} public static Singleton getInstance() { return singleton; } }
单例模式的注意事项
高并发的情况下注意单例模式的线程同步问题,测试代码如下:public class Emperor { private static String name = null; private static Emperor emperor = null; //限制产生多个对象 private Emperor(String e) { Emperor.name=e; } //通过该方法获得实例对象 public static Emperor getInstance(String e) { if (emperor == null) { emperor = new Emperor(e); } return emperor; } //类中的其他方法尽量使用static public static void say(String m) {// Emperor.name=e; System.out.println("我是:"+ m +", 参见皇帝"+Emperor.name); }}
package com.zgz.dm.Singleton;public class Minister { public static void main(String[] args) { Minister1 minister1 = new Minister1(); Minister2 minister2 = new Minister2(); new Thread(minister1).start(); new Thread(minister2).start(); /*for(int day=0; day<3; day++) { Emperor emperor = Emperor.getInstance(); emperor.say(); }*/ }}class Minister1 implements Runnable{ private String minister = "王安石"; private String s = "宋神宗1"; @Override public void run() { for(int i=0; i<10; i++) { Emperor emperor = Emperor.getInstance(); emperor.say(s,minister); try { Thread.sleep((int)Math.random()*200); } catch (Exception e) { e.printStackTrace(); } } }}class Minister2 implements Runnable{ private String minister = "苏轼"; private String s = "宋神宗2"; @Override public void run() { for(int i=0; i<10; i++) { Emperor emperor = Emperor.getInstance(); emperor.say(s,minister); try { Thread.sleep((int)Math.random()*1000); } catch (Exception e) { e.printStackTrace(); } } }}
测试结果:
转载于:https://blog.51cto.com/13416247/2296494