栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Singleton中的线程安全

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Singleton中的线程安全

Josh Bloch建议使用单元素

enum
类型实现单例(请参阅 有效的Java 2nd
Edition,第3项:使用私有构造函数或枚举类型强制单例属性
)。

有人认为这是黑客,因为它并未明确传达意图,但确实有效。

以下示例直接取自本书。

public enum Elvis {   INSTANCE;   public void leaveTheBuilding() { ... }}

这是他的结束语:

此方法更加简洁,免费提供了序列化机制,甚至面对复杂的序列化或反射攻击,也提供了针对多个实例的明确保证。尽管此方法尚未得到广泛采用,
但是单元素枚举类型是实现单例的最佳方法


enum
恒定的单保证

[JLS

8.9。枚举](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9)

枚举类型除了由其枚举常量定义的实例外,没有其他实例。尝试显式实例化枚举类型(第15.9.1节)是一个编译时错误。

中的

finalclone
方法
Enum
确保永远不会克隆枚举常量,并且序列化机制的特殊处理确保了绝不会由于反序列化而创建重复的实例。禁止枚举类型的反射实例化。总之,这四件事确保了枚举类型的实例不存在超出枚举常量定义的实例的情况。


延迟初始化

以下代码段:

public class LazyElvis {    enum Elvis {        THE_ONE;        Elvis() { System.out.println("I'M STILL ALIVE!!!");        }}    public static void main(String[] args) {        System.out.println("La-dee-daaa...");        System.out.println(Elvis.THE_ONE);    }}

产生以下输出:

La-dee-daaa...I'M STILL ALIVE!!!THE_ONE

如您所见,

THE_ONE
在第一次访问常量之前,不会通过构造函数实例化常量。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486345.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号