作用:都是为了保证只产生唯一的实例,多线程情况下,单例的形式保证只产生一个,threadLocal的形式是产生自身对应的一个实例,这个要区分清楚。 单例模式代码: public class SingletonDemo { private static volatile SingletonDemo singletonDemo; public static SingletonDemo getInstence(){ if(singletonDemo==null){ synchronized (SingletonDemo.class) { if(singletonDemo==null){ singletonDemo = new SingletonDemo(); } } } return singletonDemo; } } threadLocal模式代码: public class SingletonDemo { public SingletonDemo(){}; public static ThreadLocal<singletondemo> singletonDemo_map = new ThreadLocal<singletondemo>(); public static SingletonDemo getInstence(){ SingletonDemo singletonDemo = singletonDemo_map.get(); if(singletonDemo==null){ singletonDemo = new SingletonDemo(); singletonDemo_map.set(singletonDemo); } return singletonDemo; } } 内部类模式代码:加载一个类时,其内部类不会被加载。这样保证了只有调用getInstance()时才会产生实例,控制了生成实例的时间,实现了延迟加载。并且去掉了synchronized,让性能更优,用static来确保唯一性。 package singleton; public class StaticSingleton { private int age; public void setAge(int age){ this.age=age; } public int getAge(){ return age; } public StaticSingleton(){ } //加载一个类时,其内部类不会被加载 private static class Singleton{ private static StaticSingleton singleton = new StaticSingleton(); } public static StaticSingleton getInstence(){ return Singleton.singleton; } } 上边三类情况的测试类代码,单独测试: import java.util.Random; public class SingletonDemoTest { public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName()+":"+data); //SingletonDemo.singletonDemo_map.set(data); //System.out.println(Thread.currentThread().getName()+";age:"+SingletonDemo.singletonDemo_map.get()); // SingletonDemo.getInstence().setAge(data); // System.out.println(Thread.currentThread().getName()+";age:"+SingletonDemo.getInstence().getAge()+";code:"+SingletonDemo.getInstence().hashCode()); StaticSingleton.getInstence().setAge(data); System.out.println(Thread.currentThread().getName()+";age:"+StaticSingleton.getInstence().getAge()+";code:"+StaticSingleton.getInstence().hashCode()); } }).start(); } } }