java 单例模式

摘要:
单例模式的应用场景1:网站的计数器,一般也是单例模式实现,否则难以同步。

单例模式 : 一个类创建的 任何对象都是同一个只存在一个实例,都只开辟同一块内存空间

单例模式就是不管外部如何创建 都只是创建一个对象 对象操作的也是只个唯一对象

饿汉式:

public classSingleton {
    public static voidmain(String[] args) {
        Pattern patternOne =Pattern.getPattern();
        Pattern patternTwo =Pattern.getPattern();
        System.out.println(patternOne == patternTwo);  //true  比较两个内存地址
}
}

//饿汉式 单例模式
classPattern{

    //私有化构造方法不允许外部随意调用
    private Pattern(){}  //因为构造方法是创建对象来用的  我们不允许外部随意创建对象

    //内部创建对象
    private static Pattern pattern = new Pattern();  //对生产的对象私有化 并静态化 在内部创建完毕

    //提供公共的静态方法 返回已创建对象
    public  static  Pattern getPattern(){  //外部都只能通过此方法获取对象, 并且获取的都是同一个对象, 只开辟一块内存地址
        returnpattern;
    }

}

懒汉式:

public classSingleton {
    public static voidmain(String[] args) {
        Lazy lazyOne =Lazy.getLazy();
        Lazy lazyTwo =Lazy.getLazy();
        System.out.println(lazyOne == lazyTwo);  //true
}
}




//懒汉式


classLazy {

    //1: 私有化构造器

    privateLazy() {
    }

    //2 : 内部创建类的对象
    //4: 要求此对象必须声明为static
    private static Lazy lazy = null;

    //3 : 向外部提供一个公共的static方法
    public staticLazy getLazy() {
        if (lazy == null) {
            lazy = new Lazy();  //如果是空的时候就创建一个不然所有的都是没有在内部创建的对象,在外部就会创建
}
        returnlazy;
    }

}

懒汉式 和饿汉式 :

懒汉式 什么时候用什么时候造 饿汉式提前造好

饿汉式 VS 懒汉式

饿汉式: 坏处 对象加载时间过长 (提前创建好的 在内存中保留时间较久)

好处 :饿汉式 是线程安全

懒汉式 好处 延迟对象的创建

坏处 : 目前写法不安全 -- >多线程内部时修改

目前 :懒汉式线程不安全(当都去抢火车票 ,三个人一起刷票 然后都进入了是否为空的时候 然后第一个卡顿了 第二个第三个也进去了 最后三个人都会 去创建了对象就不是只创建一个对象了,而饿汉式提前创建好 ,不论如何卡顿 都是创建一个对象)

单例模式的优点

由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的 产生需要比较多的资源时,
如读取配置、产生其他依赖对象时,则可 以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方 式来解决。

单例模式的应用场景

 1: 网站的计数器,一般也是单例模式实现,否则难以同步。
 
2: 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志 文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

3:  数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库
资源。

4:  项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置
 文件数据,都生成一个对象去读取。
5: Application 也是单例的典型应用
6:Windows的Task Manager (任务管理器)就是很典型的单例模式

7: Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程
 中,回收站一直维护着仅有的一个实例。

解决懒汉式的线程安全

classBankTOne{
    privateBankTOne(){}

    private  static BankTOne bankTOne = null;
    

    //方式一
    /**


    public  static synchronized BankTOne getBankTOne(){  // 此时
        if(bankTOne == null){
            bankTOne = new BankTOne();
        }
        return bankTOne;
    }


    //上面的方法等于这种方法

    public  static BankTOne getBankTOne(){
        synchronized(BankTOne.class){
            if(bankTOne == null){
                bankTOne = new BankTOne();
            }
            return bankTOne;
        }
    }

     */


    //方式二 效率高,  这样第一个线程拿走最后一个的时候下面的线程就不用再进入其中了
    public staticsynchronized BankTOne getBankTOne(){
        if(bankTOne == null){
            synchronized(BankTOne.class){
                if(bankTOne == null){
                    bankTOne = newBankTOne();
                }
            }
        }
        returnbankTOne;
    }

}

免责声明:文章转载自《java 单例模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cassandra CQL 常用操作使用Distinct()内置方法对List集合的去重 问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android中文API(115)——AudioFormat

前言   本章内容是android.media.AudioFormat,版本为Android 3.0 r1,翻译来自"文炜",欢迎大家访问他的博客:http://www.cnblogs.com/iezhyg/,再次感谢"文炜" !期待你加入Android 中文翻译组,联系我over140@gmail.com。 声明   欢迎转载,但请保留文章原始出处:...

Django --- 与数据库进行交互

目录 1.静态文件配置 1.什么是静态文件 2.为什么用户在浏览器中输入的网址能够访问到响应的资源?有时候不能访问? 3.如果想要访问静态资源怎么做? 4.手动开设静态文件访问资源 5.关于两个static的联系 6.如果想要更改很多个接口前缀,使用什么方法? 2.get请求和post请求 1.from表单 2.get请求 3.注意点:...

使用Mybatis执行sql脚本

pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

java倒计时三种简单实现方式

写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时; 二:设置时间戳的倒计时; 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: 1 package timer; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 impo...

使用Cucumber+Rspec玩转BDD(7)——测试重构

使用Cucumber+Rspec玩转BDD(7)——测试重构 2009年4月5日 星期日 ### 温故知新 ###在前面的六个章节中,我们循序渐进地完善了一个用户帐号系统,这样的系统一般都会作为一个独立的模块交付。在交付这个模块之前,还需要进一步地做些重构工作。在这篇文章中,笔者将会围绕测试重构展开。源码下载:http://github.com/4...

springboot+thymeleaf 访问静态资源解决(static)

---------------------------------------2.1.3------------------------------------------------------------------ 第一步:pom.xml-必须有这个 <dependency><groupId>org.springframewo...