单例模式场景模拟和问题解决
创始人
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 

相关内容

热门资讯

此事引发广泛关注!新芒果监利开... 此事引发广泛关注!新芒果监利开机有挂吗,内蒙古边锋老友辅助(原来真的有下载)-哔哩哔哩1、实时新芒果...
最新技巧!!微信小程序黑科技(... 最新技巧!!微信小程序黑科技(外挂),微乐游戏竞技团辅助一直真实有挂1、公共底牌简单,透视插件操作,...
随着!上饶辅助工具,麻友圈安庆... 随着!上饶辅助工具,麻友圈安庆版插件(竟然存在有软件)-哔哩哔哩1、打开软件启动之后找到中间准星的标...
攻略讲解!微信小程序黑科技(外... 攻略讲解!微信小程序黑科技(外挂),微乐小程序插件免费切实真实有挂能透视中分为三种模型:模拟器、私人...
一直以来!雀神麻将辅助透视,潮... 您好,潮友会鱼虾蟹下载链接这款游戏可以开挂的,确实是有挂的,需要了解加去威信【485275054】很...
热点推荐!!微乐小程序免费黑科... 热点推荐!!微乐小程序免费黑科技(外挂),微乐陕西小程序破解器竟然有挂辅助1、辅助器安装包、辅助器2...
此事备受玩家关注!掌中乐游戏中... 此事备受玩家关注!掌中乐游戏中心辅助器,jj斗地主外卦(总是真的有安装)-哔哩哔哩进入游戏-大厅左侧...
揭秘真相!微乐小程序黑科技(外... 揭秘真相!微乐小程序黑科技(外挂),微乐自建房怎么提高胜率真是有挂秘籍1、有没有辅助教程、有透视吗等...
不少玩家反映!微信小程序多乐跑... 不少玩家反映!微信小程序多乐跑得快破解,赣南好友辅助(切实真的是有器)-哔哩哔哩小薇(辅助器软件下载...
1.9分钟了解!微信小程序黑科... 1.9分钟了解!微信小程序黑科技(外挂),微乐家乡麻将辅助总是有挂辅助1、该软件可以轻松地帮助玩家将...