• aof 置顶
    2020-02-05
    这真的是看过的关于讲单例的最好的文章
    
     12
  • Douglas
    2020-02-05
    争哥新年好, 有个问题想请教一下,单例的实现中看到过一种实现方式,包括在spring源码中有类似的实现 ,代码如下
     1. public class Singleton {
        private static volatile Singleton instance=null;
        private Singleton() {
        }

        public static Singleton getInstance() {//
            Singleton temp=instance; // 为什么要用局部变量来接收
            if (null == temp) {
                synchronized (Singleton.class) {
                    temp=instance;
                    if (null == temp) {
                        temp=new Singleton();
                        instance=temp;
                    }
                }
            }
            return instance;
        }
    }

    spring源码 如 ReactiveAdapterRegistry。
    JDK 源码 如 AbstractQueuedSynchronizer。
    很多地方 都有用 局部变量 来接收 静态的成员变量, 请问下 这么写有什么性能上的优化点吗?
    jcu 包下面类似的用法太多。想弄明白为什么要这样写
    2. 看jdk 官方的文档(JMM)有说明 指令重排发生的地方有很多 ,编译器,及时编译,CPU在硬件层面的优化,看spring 比较新的代码也使用volatile来修饰,你说的new 关键字和初始化 作为原子操作 可以说一下 大概的jdk版本吗
    展开
     5
     6
  • 辣么大
    2020-02-05
    简单的方法:创建一个静态私有的filewritter,多线程或者多个Logger对象共享一个filewritter。
    
     4
  • 黄林晴
    2020-02-05
    打卡

    看过Eventbus 的源码,写法是典型的双重锁检验方式,但是构造方法是public 的

    看源码解释,这是因为EventBus可能有多条总线,订阅者注册到不同线上的 EventBus,通过不同的实例来发送数据,不同的 EventBus 是相互隔离开的,订阅者都只会收到注册到该线上事件。

    但是按照单例定义他又不属于单例,感觉很有疑问
    展开
     2
     3
  • 忆水寒
    2020-02-05
    第一个问题,在我的项目中缓存类的节点设置为单例模式,还有加载全局配置文件的类,也设置为了单例模式。
    第二个问题,我是用消息队列实现的日志收集。
    
     2
  • 🤤🤤
    2020-02-05
    这篇非常棒,🔨
    
     2
  • 小晏子
    2020-02-05
    1.JDK中 java.lang.Runtime是单例实现的,该类用于管理应用程序运行期间的各种信息,比如memory和processor信息,所以从该类的用途可以知道该类必须是单例的。
    2. 使用多个文件,每new一个实例就使用一个新文件,这样就没有文件覆盖问题了。
    
     2
  • zs阿帅
    2020-02-06
    争哥,如果服务是多个实例跑,日志那个单例模式会导致覆盖吗?
    
     1
  • 沈康
    2020-02-06
    1、java bean大部分都是单例吧,例如我们的service bean,单例也是为了复用类和资源共享吧,但是要注意单例需要无状态,有状态的则要考虑线程安全问题
    2、如果线程安全的话,共享一个类就可以了,依赖注入
    
     1
  • Summer 空城
    2020-02-05
    王老师这篇讲解的非常棒,赞!
    
     1
  • 传说中的成大大
    2020-02-10
    为何在讲本文中实战一
    ublic class OrderController { private Logger logger = new Logger(); public void create(OrderVo order) { // ...省略业务逻辑代码... Logger.getInstance().log("Created a order: " + order.toString()); }}
    还有一行这个代码?private Logger logger = new Logger();
    
    
  • Fstar
    2020-02-10
    我想到的其他解决日志互相覆盖问题的方法:
    1. 配合数据库使用。数据库自己做了处理,就不需要自己考虑覆盖问题了。缺点是日志系统理论上不应该用上数据库,会导致扩展性不好。
    2. 每个线程创建一个日志文件,间隔一段时间将多个日志文件进行合并为大的日志文件。缺点是线程多的时候比较消耗资源。
    3. 将日志信息发送出去,比如通过 http 请求,让一个单线程的服务接收并记录日志。这种实现有点像消息队列了。
    
    
  • 相逢是缘
    2020-02-09
    打卡
    1、单例模式的定义:
    一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
    2、单例的用途:
    1)处理资源访问冲突问题
    2)处理数据在系统中只应保存一份
    3、如何实现一个单例类
    1)饿汉模式
    类加载时,instance实例已经创建好;
    2)懒汉模式
    延迟加载,但是getInstance需要加锁,导致并发度很低
    public static synchronized IdGenerator getInstance() {
    if (instance == null) {
    instance = new IdGenerator();
    }
    return instance;
     }
    3)双重检测
    只要 instance 被创建之后,即便再调用 getInstance() 函数也不会再进入到加锁逻辑中了。
    (支持延迟加载、支持高并发)
    public static IdGenerator getInstance() {
     if (instance == null) {
    synchronized(IdGenerator.class) { // 此处为类级别的锁
    if (instance == null) {
     instance = new IdGenerator();
    }
    }
    }
    return instance;
     }
    4)静态内部类
    insance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。
    private static class SingletonHolder{
    private static final IdGenerator instance = new IdGenerator();
    }
    public static IdGenerator getInstance() {
    return SingletonHolder.instance;
     }
    5)枚举

    展开
    
    
  • 天天向上卡索
    2020-02-07
    之前做WP开发的时候用到的硬件如Camera大多是单例,之前看微软的源码有的单例使用并发字典来实现的
    
    
  • 东流
    2020-02-06
    1.在你所熟悉的编程语言的类库中,有哪些类是单例类?又为什么要设计成单例类呢?
    java 中的打印类,System.out,(我猜的);原因则是用起来方便

    在第一个实战案例中,除了我们讲到的类级别锁、分布式锁、并发队列、单例模式等解决方案之外,实际上还有一种非常简单的解决日志互相覆盖问题的方法,你想到了吗?
    没
    
    
  • 小猴子吹泡泡
    2020-02-05
    如果要实现序列化反序列化的单例模式,要增加一个readResolve()方法,代码如下:
    protected Object readResolve() throws ObjectStreamException {
        return instance;
    }
    
    
  • javaadu
    2020-02-05
    第一个问题:Spring框架中,大部分的组件都是单例的;
    第二个问题:将不同业务的日志拆开,并将Logger对象用static关键词修饰
    
    
  • Frank
    2020-02-05
    1. 目前能想到的类库中使用了单例模式的有连接池、java.lang.Runtime#getRuntime,Hibernate的SessionFactory、Configuration,这么设计的的原因是维持全局唯一,还存在这些类的实例可能会占用很多内存,或者实例的初始化过程比较冗长。
    2. 写日志的例子中还可使用JDK1.4 提供的FileLock来解决资源竞争问题,其他更简单的方式想不到。
    
    
  • 辣么大
    2020-02-05
    写了篇总结,还讨论了单例模式中序列化和反序列化的问题。https://github.com/gdhucoder/DesignPattern/blob/master/021_SingletonPattern.md
    
    
  • 松花皮蛋me
    2020-02-05
    MDC,在日记上下文中记录线程信息以区分日记
    
    
我们在线,来聊聊吧