//饿汉模式:单例模式,就是无论用不用,什么时候用,在类加载的时候就实例化一个这个类的对象
//然后等到使用的时候,就是使用同一个实例对象
//好处:在多线程的环境下使用这种方法,可以避免多线程带来的冲突。与之相对应的是,懒汉模式(按需实例化)
class Singleton1{ private Singleton1(){} private static Singleton1 s1 = new Singleton1(); public static Singleton1 getSingleton(){ return s1; } }
//懒汉模式:单例模式,
//好处:直到使用才进行实例对象的初始化,避免内存的浪费
//坏处:会遇到线程安全性问题
class Singleton2{ private Singleton2(){} private static Singleton2 s2 = null; public static Singleton2 getSingleton2(){ if(s2 == null){ s2 = new Singleton2(); } return s2; } }
//登记式模式:借助内部类,属于懒汉式单例,因为Java机制规定,
//内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),
//而且其加载过程是线程安全的,所以这种模式克服了懒汉和饿汉模式的缺点
class Singleton3{ private Singleton3(){} private static class SingleHolder{ private final static Singleton3 s3 = new Singleton3(); } public static Singleton3 getSingleton3(){ return SingleHolder.s3; } }
//普通加锁解决单例模式的线程安全问题
//分析:虽然解决了线程安全问题,但是每个线程调用getInstance都要加锁,
//我们想要只在第一次调用getInstance时加锁,就需要进行改进
class Singleton4{ private static Singleton4 s4= null; private Singleton4(){} public static synchronized Singleton4 getSingleton4(){ if(s4 == null){ s4 = new Singleton4(); } return s4; } }
时间: 2024-10-11 20:06:47