茴字有很多种写法,推荐用枚举。不多讲。讲一下各种写法的区别以及牵涉到的理论知识点。
Q:为什么要保证线程安全?
A:如果线程不安全,将会失去单例的意义,也就是说会产生不止一个实例。同时也可能引起程序报错等其他错误。
知识点:线程安全的本质。简单讲线程不安全,是因为有些资源是线程共用的(比如进程数据、代码、堆、栈)。不同的线程操作同一个对象,当然就不安全了。
Q:怎样保证线程安全?
A:保证实例化(比如构造方法)只执行一次,那么就只会产生一个实例,那你怎么拿 都是同一个。
Q:怎样保证只实例化一次呢?
A:炫技时刻到了,N多种写法,分别用了:枚举类加载时会执行一次,静态代码加载时会执行一次,class文件唯一次等知识点。有兴趣的朋友可以搜索相应文章学习。
知识点:类加载顺序-->静态代码(仅一次),构造代码(每次实例化调用),构造方法(每次实例化调用),普通代码(实例对象正常调用)。
那么,静态方法呢?
答:静态方法归属类,不归属对象,在内存中会存在元数据区(顺便学习jvm的内存模型),只能由类直接调用。仅此。
同时,我不禁想到了另一点,那就是,spring对bean的管理,默认都是单例的。那是不是提供了另一个单例思路??
方式:私有构造方法,并且禁止反射获取(具体方法另说),每次使用都用注解注入,或者都用factory去拿,即可保证。