• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Nobody

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

双检锁(DCL)实现懒汉单例模式

public class Singleton{
    private volatile static Singleton obj;
    public Singleton(){}
    public getSingleton(){
        if(singleton == null){
            synchronized(Singleton.class){
                if(singleton == null){
                    obj = new Singleton();
                }
            }
        }
        return obj;
    }
}
  • 为什么使用两次if判断?
    因为多线程环境下只有创建单例对象时才会产生竞争。如果已经有实例化对象,则不需要进入加锁的步骤,直接返回,提高效率。第二次判断是防止创建出多个实例,多个线程进入第一个if时,一个线程释放了锁,其他线程会获取锁,从而导致多个实例创建,第二个if就是为了避免创建多个实例。
  • 为什么使用了synchronized关键字还要使用volatile关键字?
    synchronized是为了保证多线程环境下的线程安全,而volatile是为了禁止指令重排。

posted on 2023-05-19 10:50  A_Nobody  阅读(53)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3