黑马程序员-Java基础-多线程之单例模式总结

来源:互联网 发布:matlab数据相关性分析 编辑:程序博客网 时间:2024/04/30 11:35
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------


      Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

    一般Singleton模式通常有几种种形式,第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {

private Singleton(){}

      //在自己内部定义自己一个实例

      //注意这是private 只供内部调用

      private static Singleton instance = newSingleton();

      //这里提供了一个供外部访问本class的静态方法,可以直接访问  

      public static Singleton getInstance() {

        return instance;   

      }

    }

    第二种形式:

public class Singleton {

  privatestatic Singleton instance = null;

  publicstatic synchronized Singleton getInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     

  //使用时生成实例,提高了效率!

  if(instance==null)

    instance=new Singleton();

return instance;   }

}

其他形式:

定义一个类,它的构造函数为private的,所有方法为static的。

一般认为第一种形式要更加安全些。

package blog.Javase.Thread;/** * 单例模式有两种写法: * 1、饿汉式:创建实例的同时,在内存中开辟空间。 * 2、懒汉式:创建实例时,先不创建空间,使用时才去开辟空间。 * @author  kevin * @version v1.1 */public class SingletonDemo {public static void main(String[] args) {System.out.println("Singleton Instance");}}/* * 实现方式一:饿汉式 * 它的特点是实现简单,实例创建时即初始化并开辟空间, *       多线程调用时不会产生安全性问题,因为方法中只有一条return语句。 */class Single { private static final Single instance = new Single();  private Single() {} public static Single getInstance() {    return instance; } }/* * 实现方式二:懒汉式 * 它的特点是:先创建实例,但是不开辟空间,当对象调用时才去初始化并开辟空间,使用了延迟加载; *        在函数中语句较多,多线程访问时会出现线程安全性问题。*/class Single2{    private static Single2 s = null;    private Single2(){}    public static synchronized  Single2 getInstance()    {    if(s == null)    s = new Single2();    return s;    }    }//面试中常考的单例模式,懒汉模式改进class Single3{/* * 懒汉式每次都要判断锁,占用了资源,为了提高效率,使用同步块改进. *  * 懒汉式和饿汉式有什么不同呢?: *   懒汉式的特点在于采用了实例的延迟加载; *   延迟加载在多线程访问时会产生安全性问题; *   可以加同步来解决; *   同步函数和同步代码块都可以解决安全性问题,但是同步函数稍微有些低效, *   用双重判断的形式能解决效率问题。 *   同步代码块在静态方法中使用的琐是该类所属的字节码文件对象。 */    private static Single3 s = null;    private Single3(){}    public static   Single3 getInstance()    {    if(s == null)    {    synchronized(Single3.class)    {    if(s == null)    s = new Single3();    }    }    return s;    }    }



---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小狗5天不吃东西怎么办 手上猴子总是不停的起怎么办 真空压缩袋破了怎么办 兔子突然腿瘸了怎么办 被宠物兔咬出血怎么办 小兔子不吃东西精神不好怎么办 小狗脐带咬开了怎么办 刚生的狗就死了怎么办? 兔子生了不喂奶怎么办 兔子出生4天摸了怎么办 兔子吃了纸箱子怎么办 被小兔子抓一下怎么办 兔子吃了蟑螂药怎么办 兔子洗了澡要死怎么办 养的花蔫了怎么办 养的小鸡很大了怎么办 养的小兔子死了怎么办 小狗出现爬跨行为怎么办 养的小狗总做吞咬人的行为怎么办 螃蟹和柿子一起吃了怎么办 指甲上月牙没了怎么办 手指上月牙没了怎么办 指甲上没半月牙怎么办 电动车车牌被偷了怎么办 警察拖车拖坏了怎么办 6岁儿童牙疼怎么办 小白单车不退押金怎么办 光盘放笔记本电脑里读不出来怎么办 cd光盘读不出来怎么办 最近脸干的不行怎么办 脸感觉干的不行怎么办 新生儿睡觉黑白颠倒了怎么办 婴儿吐水和奶花怎么办 刚刚出生的宝宝拉肚子怎么办 刚出生的婴儿拉肚子怎么办 新生儿5天拉稀水怎么办 10个月孩子拉肚子怎么办 不满月的宝宝拉肚子怎么办 一周岁宝宝发烧腹泻呕吐怎么办 6个月宝宝37度怎么办 1岁宝宝发烧37.2怎么办