一、懒汉式单例多线程模式
1、创建模拟的servlet生成器
package cn.bjsxt.sing; import java.util.UUID; public class LszySingleton { //servlet不建议使用成员变量 // 给当前的servlet定义成员变量 // String uuid = null; static LszySingleton instance = null; // 构造器私有化就是不让通过构造器来不断构建对象 /* public */private LszySingleton() { System.out.println("HungrySingleton.HungrySingleton()"); } public static void init(){ System.out.println("LazySingleton.init()"); } public /*synchronized*/ void service(){ //每当线程调用service方法,都会重新生成uuid号 String uuid = UUID.randomUUID().toString().replace("-", ""); //显示当前线程所有携带的成员uuid System.out.println(Thread.currentThread().getName()+"---"+uuid); } // 对外提供专门的方法来获取对象(实例instance) //双重线程检验 doublecheck public static/* synchronized */LszySingleton getInstance() { if (null == instance) { // 如果当前的对象实例为空,则创建该对象 synchronized (LszySingleton.class) { if(null==instance){ instance = new LszySingleton(); init(); } } } return instance; } }
2、模拟tomcat服务器
package cn.bjsxt.sing; public class tomcatrun implements Runnable { @Override public void run() { // TODO Auto-generated method stub LszySingleton instance = LszySingleton.getInstance(); instance.service(); } }
3、访问tomcat服务
public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(new tomcatrun()).start(); } }
二、饿汉式单例多线程
1、创建服务器
package cn.bjsxt.zs; public class HungrySingleton { //饿汉式单例模式: static HungrySingleton instance=new HungrySingleton(); private HungrySingleton(){ System.out.println("HungrySingleton.HungrySingleton()"+"创建一个对象"); } public static HungrySingleton getInstance(){ return instance; } }
2、调用
package cn.bjsxt.zs; public class Tomcat implements Runnable{ public void run(){ //Singleton.getInstance(); HungrySingleton.getInstance(); //System.out.println(LazySingleton.getInstance()); } public static void main(String[] args) { for (int i=0; i<5; i++) { new Thread(new Tomcat()).start();; } } }