最近在看jvm,发现随着自己对jvm底层的了解,现在对java代码可以说是有了全新的认识。今天就从jvm的角度来看一看以前自以为很了解的单例模式。

了解单例模式的人都知道,单例模式有两种:“饿汉模式”和“懒汉模式”。

引用一段网上对这两种模式的介绍:

“饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全。饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉模式的特点是加载类时比较快,但是在运行时获取对象的速度比较慢,线程不安全, 懒汉式如果在创建实例对象时不加上synchronized则会导致对象的访问不是线程安全的。所以在此推荐大家使用饿汉模式。”

笔者先给出结论“上面这段描述可以说是完全不正确,最后给出的结论还算勉强正确,为什么说勉强正确,因为我不会推荐大家使用饿汉模式,我会直接说就用饿汉模式,懒汉模式在任何情况下都不需要”。

网上这段文字的错误主要有两点

  1. 懒汉模式线程不安全,如果想线程安全必须加synchronized

  2. 饿汉模式在加载类时会慢

先来看一下懒汉模式,不用synchronized也能实现线程安全

先来回顾一下懒汉模式的“发展史”

懒汉模式V1.0:

网友评论