手写单例模式

/**
 * 单例模式
 * @author gy2018
 *
 */
public class SingletonDemo {
    /**
     * 所谓的单例模式,就是整个程序有且仅有一个实例。
     * 该类负责创建自己的对象 并确保只有一个对象被创建。
     * 在java中,一般常用在工具类的实现或创建对象 需要消耗资源
     *
     * 特点:
     * 类构造器私有
     * 持有自己类型的属性
     * 对外提供获取实例的静态方法
     */
    
    
    /**
     * 饿汉模式
     * 线程安全,比较常用,但是一开始就初始化,容易产生垃圾
     */
//    //创建私有静态的对象
//    private static SingletonDemo singletonDemo = new SingletonDemo();
//    //私有构造器
//    private SingletonDemo(){};
//    //提供一个共有可调用的方法获取实例
//    public static SingletonDemo getSingletonDemo(){
//        return singletonDemo;
//    }
    
    /**
     * 懒汉模式
     * 线程不安全,延迟初始化,严格意义上来讲不是单例模式
     */
//    private static SingletonDemo instance;
//    private SingletonDemo(){};
//    public static SingletonDemo getInstance(){
//        if(instance == null){
//            instance = new SingletonDemo();
//        }
//        return instance;
//    }
    
    /**
     * 双重锁的单例模式,安全且在多线程情况下能保持高性能
     * 进行了两次判断,避免了不要的实例,第二次是为了同步,避免多线程问题。
     * 由于instance = new SingletonDemo()对象的创建在JVM中可能会进行重排序,
     * 在多线程访问下存在风险,使用volatile修饰instance实例变量有效,解决该问题。
     */
    private static SingletonDemo instance;
    private SingletonDemo(){};
    public static SingletonDemo getInstance(){
        if(instance == null){
            synchronized (SingletonDemo.class) {
                if(instance == null){
                    instance = new SingletonDemo();
                }
            }
        }
        return instance;
    }
}

原文地址:https://www.cnblogs.com/gygx110/p/12085174.html

时间: 2024-10-28 08:39:00

手写单例模式的相关文章

Java面试必备:手写单例模式

面试官:请手写下几种常见的单例模式 我:好的(面带微笑),心里暗喜(送分题). 没成想提笔便写出了如此豪放的代码,不堪回首,请原谅我的不羁! 此篇整理了几种常见的单例模式代码示例,再有面试官让手撕单例模式,便能心中有码,下笔有神. 为什么要有单例模式 实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象.缓存.系统全局配置对象等.这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源. 实现单例模式的几个要点 首先要确保全局只有一个类的实例. 要保证这一点,至少类的构造器

java架构之路(多线程)大厂方式手写单例模式

上期回顾: 上次博客我们说了我们的volatile关键字,我们知道volatile可以保证我们变量被修改马上刷回主存,并且可以有效的防止指令重排序,思想就是加了我们的内存屏障,再后面的多线程博客里还有说到很多的屏障问题. volatile虽然好用,但是别用的太多,咱们就这样想啊,一个被volatile修饰的变量持续性的在修改,每次修改都要及时的刷回主内存,我们讲JMM时,我们的CPU和主内存之间是通过总线来连接的,也就是说,每次我们的volatile变量改变了以后都需要经过总线,“道路就那么宽,

手写CrashHandler实现UncaughtExceptionHandler拦截android异常

手写CrashHandler实现UncaughtExceptionHandler拦截android异常 作者:码字员小D 有点复杂,虽然知道原理,但是并不好从哪开始写了...... 首先这是个需要在整个app运行状态中都需要存在的对象,所以需要在application里初始化这个类,并且这个类实例~~~慢着!发现这里代码有疑问,application中只在oncreate方法里面初始化 public class CrashApplication extends Application { @Ov

关于java写一个单例类(面试手写题)

package com.shundong.javacore; /** * java写一个简单的单例类 * @author shundong * */ class Singleton { //使用一个类变量来缓存曾经创建的实例 private static Singleton instance; //对构造进行隐藏(private) private Singleton(){} /** * 提供一个静态方法 * 该方法加入了自定义控制 保证只产生一个Singleton对象 * @return 返回S

2019秋招复习笔试--手写代码

1. 手写一个单例模式 2. 手写一个生产者消费者模式 3. 手写一个LRU算法的实现: 4. 手写快排 5. 手写堆排 6. 手写树的遍历(先序.中序.后序.层序) 7. 手写一个二分查找 #. 剑指OFFER #. LeetCode 原文地址:https://www.cnblogs.com/greatLong/p/11505100.html

c++后台开发面试常见知识点总结(六)算法手写

链表倒转  leetcode-206 连续子数组最大和问题(和最大的连续子序列的和)   leetcode-53 输出字符串中最长的回文子串长度?  leetcode-5 一个字符串,求最长无重复子串的长度?  leetcode-3 最长递增子序列  leetcode-300 反转一个字符串......(手写代码) leetcode-344 数组中存在一个大于n/2次的数,如何以最优方法查找它?LeetCode 169 \ 229 一个字符串中{}  [ ]  ()匹配问题     LeetCo

wex5 实战 手写签名与上传

之前做过一个物流演示模块,有一个功能没做完,就是收件人收货后,可以手写签名并上传,替代传统纸张的签名.今天终于做完了. 一 效果演示: 后台图片上传成功 二 设计思路: 运用canvas插件jq-signature,制作手写签名,并通过二进制流方式上传图片 三 代码实现: 1 .下载引入插件jq-signature 手写签名插件,网上有很多,经过多种插件的逐步尝试,只有插件jq-signature达到了我想要的效果; 原因有二:1,支持手机触摸,web,鼠标.其它有的不支持手机触摸. 2,直接转

iOS开发UI基础—手写控件,frame,center和bounds属性

一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View Contollor和view的关系 2.注意点 在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: [btn addTarget:self action:@selector(click:) forContro

logistic回归与手写识别例子的实现

本文主要介绍logistic回归相关知识点和一个手写识别的例子实现 一.logistic回归介绍: logistic回归算法很简单,这里简单介绍一下: 1.和线性回归做一个简单的对比 下图就是一个简单的线性回归实例,简单一点就是一个线性方程表示 (就是用来描述自变量和因变量已经偏差的方程) 2.logistic回归 可以看到下图,很难找到一条线性方程能将他们很好的分开.这里也需要用到logistic回归来处理了. logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,