单例模式场景模拟和问题解决
创始人
2025-01-08 14:32:32
0

饿汉式单例

private static Student student = new Student(); 

不存在线程安全问题

懒汉式单例

线程安全问题

package org.example.Singleton;  import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger;  public class SingletonTest {     private static Student student = new Student();      private static Car car = null;      private static AtomicInteger count = new AtomicInteger(0);      private static ExecutorService threadPoolExecutor = Executors.newCachedThreadPool();      private static final CountDownLatch latch = new CountDownLatch(15);      SingletonTest() throws InterruptedException {         threadNonSafeLoad();     }      public static void main(String[] args) throws InterruptedException {         loadInstance();         latch.await();         System.out.println(count.get());     }      private static void threadSafeLoad() {      }      private void threadNonSafeLoad() {         //        System.out.println(this.car);         if (this.car == null) {             count.addAndGet(1);             this.car = new Car();         }         latch.countDown();     }      private static void loadInstance() {         for (int i = 0; i < 15; i++) { //            Thread.sleep(50);             Thread thread = new Thread(() -> {                 try {                     new SingletonTest();                 } catch (InterruptedException e) {                     throw new RuntimeException(e);                 }             });             threadPoolExecutor.execute(thread);         }     } }  class Student {     private String name; }  class Car {     private String name; } 

运行结果:

会多次创建`Car`对象 1~15 

解决方法-双重判断

    private void threadSafeLoad() {         if (this.car == null) {             // 避免每次都加锁进行判断             synchronized (SingletonTest.class) {                 if (this.car == null) {                     count.addAndGet(1);                     this.car = new Car();                 }             }         }         latch.countDown();     } 
    SingletonTest() throws InterruptedException { //        threadNonSafeLoad();         threadSafeLoad();     } 

运行结果:

1 

相关内容

热门资讯

揭秘真相“we-poker辅助... 揭秘真相“we-poker辅助器”开挂(透视)辅助平台(透明挂教程有挂技巧);无需打开直接搜索打开薇...
透视辅助!拱趴大菠萝挂哪里,w... >>您好:拱趴大菠萝挂哪里确实是有挂的,很多玩家在这款拱趴大菠萝挂哪里游戏中打牌都会发现很多用户的牌...
我来分享“pokemmo脚本辅... 我来分享“pokemmo脚本辅助器下载”开挂(透视)辅助安装(安装教程有挂实锤) 【无需打开直接搜索...
透视辅助!aapoker透视脚... 透视辅助!aapoker透视脚本下载,拱趴大菠萝万能挂图解,分享开挂辅助神器(透视有挂解惑) 了解更...
透视辅助!哈糖大菠萝免费辅助器... 透视辅助!哈糖大菠萝免费辅助器,wpk透视怎么安装,曝光开挂辅助插件(透视真的有挂)【无需打开直接搜...
透视软件“德州局透视”开挂(透... 透视软件“德州局透视”开挂(透视)辅助软件(攻略教程!有挂辅助);无需打开直接搜索薇:1367043...
透视辅助!wpk辅助器是真的吗... 透视辅助!wpk辅助器是真的吗,wepoker私人定制透视,教会开挂辅助工具(透视有挂规律)>>您好...
一分钟了解“拱趴游戏破解器”开... >>您好:确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到...
透视辅助!hhpoker软件靠... 透视辅助!hhpoker软件靠谱吗,wepokerplus透视脚本免费,发现开挂辅助神器(透视有挂透...
查到实测辅助“hh poker... 您好:这款游戏是可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好...