单例模式与多线程

来源:互联网 发布:apm飞控软件 编辑:程序博客网 时间:2024/05/22 04:47
package singleton;/* * 忽略try catch代码 * */public class Singleton_1 {/**  * @Title: main  * @Description: 单例模式 * 1、立即记载,即使用类的时候已经将对象创建完成  * 2、延迟加载,即通过调用get方法,才创建对象 * @param @param args    设定文件  * @return void    返回类型  * @throws  *//** * 这种单利是立即加载的,因为getInstance方法没用同步,所以有非线程安全问题 * 同时不能有其他实例变量。 *//*************************************************************************************/private static Singleton_1 singleton_1 = new Singleton_1();//私有成员,外部屏蔽private Singleton_1() {//私有构造,无论延迟或立即加载,保证单例均需要私有无参构造,避免外部new}public static Singleton_1 getInstance() {return singleton_1;}/**************************************************************************************///延迟加载private static Singleton_1 singleton_2 = new Singleton_1();public static Singleton_1 getSingleton_2(){if(singleton_2!=null){}else {singleton_2 = new Singleton_1();}return singleton_2;}/**1、对getSingleton_2 getSingleton_1 方法添加synchronized关键字,实现多线程同步,效率低下,线程需要等待上个线程释放锁,才可以继续执行,一旦线程较多,将会非常慢 * 2、对 singleton_2 = new Singleton_1();添加synchronized,同样有非线程安全问题**///解决办法,DCL(Double-Check locking)双检查锁机制,无参构造省略/**********************************************************************************************/private  volatile static Singleton_1 singleton_3;public static Singleton_1 getSingleton_3() {if (singleton_3!=null) {}else{synchronized (Singleton_1.class) {if(singleton_3==null){singleton_3 = new Singleton_1();}}}return singleton_3;}/***********************************************************************************************///使用静态内置类实例单例模式private static class myclass{private static Singleton_1 singleton_4 = new Singleton_1();}public static Singleton_1 getSingleton_4(){return myclass.singleton_4;}}


还可以通过static代码块或enum枚举实现单例模式


原创粉丝点击