天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。

字节三面:单例模式的懒汉模式为什么在高并发中会出现问题?

itzoo 365次浏览 0个评论

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!



为什么单例模式中的懒汉模式不适合在高并发中使用,下面一个例子告诉你。



1

前言


我们对于单例模式我觉得是23种设计模式中大家最熟悉的一个,但是我们真的理解清楚了吗?小编最近才想到都说懒汉模式不合适出现在高并发中,会出现并发问题,于是小编研究了一下才发现,今天就带大家用一个例子来证明是不是高并发会出现错误!!


 

2

懒汉模式优缺点


优点


懒汉式相对于饿汉式的优势是支持延迟加载


缺定


懒汉式有性能问题,不支持高并发


 

3

案例分析


手机数量类


@Data
public class Phone {

    //手机余额
    private AtomicInteger count = new AtomicInteger(3);

    private Phone(){}

    private static Phone phone;

    public static Phone getInstance(){
        if (phone == null){
            phone = new Phone();
        }
        return phone;
    }

    public int getReduce(){
        return count.decrementAndGet();
    }

}


高并发进行手机秒杀


public class BingFa {

    public static void main(String[] args) {

        // 创建3个线程,线程里面进行加操作
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                Phone phone = Phone.getInstance();
                int reduce = phone.getReduce();
                System.out.println(Thread.currentThread().getName()+
                "线程抢到了手机,剩余手机数量"+"-----"+reduce);
            }, String.valueOf(i)).start();
        }

    }
}


抢购结果展示



 

4

总结


从上面的结果来看,我们很明显的看出来,懒汉式在面对高并发的时候,出现了并发错误,也就是秒杀的买超了问题,我们这里是三个线程买到的都是一个手机,而不是三个手机。原因是因为三个线程可能都拿到了时间片,然后再懒汉式中判断phone == null,他们三个线程都以为为空都创建了一个对象,这样就成了new了三个对象,其实只能存在一个对象。这是小编自己的一些理解,如果有不恰当的地方,还请指出!!


PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。


往期推荐



IntelliJ IDEA 2021.3 最终版正式发布,还是那么香!(末尾有惊喜)

每日开源 | 一款基于 SpringBoot+Vue 开发的分布式网盘系统

JetBrains:推出“新一代 IDE ”!VS Code 对手来了

推荐几款数据可视化大屏项目,科技感爆棚!!

Fastjson 的漏洞还是挺多的…

面试官:为什么不建议把数据库部署在Docker容器内?



ITZOO版权所有丨如未注明 , 均为原创丨转载请注明来自IT乐园 ->字节三面:单例模式的懒汉模式为什么在高并发中会出现问题?
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址