多线程环境测试单例5种实现方式的效率

本文探讨了在多线程环境中,通过使用CountDownLatch类对比测试了5种单例实现方式的效率,结果显示懒汉式由于涉及同步操作,其性能表现最慢,而其他方式效率接近。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写一段代码来测试:

public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
        /*
        下面这么写是有问题的,因为这是多线程,当main线程执行完了,其他线程还没执行完,
        代码就已经到end那了,这样时间就不对了,算的只是main线程的时间。
         */
        for (int i = 0; i <10 ; i++) {
          new Thread(new Runnable() {
            @Override
              public void run() {
                  for (int i = 0; i < 1000000; i++) {
                    TestDcl dcl=TestDcl.getInstance();
                  }
              
              }
           }).start();
        }
   
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end-start));

    }
}

上面这段代码这么写是有问题的,因为这是多线程。我们可以用CountDownLatch类来实现我们的目的。

 * CountDownLatch:同步辅助类,在完成一组正在其他线程中执行的操作之前,
 *   它允许一个或多个线程一直等待。
 *   countDown():当前线程调用此方法,则计数减一(建议放在final里执行)
 *   await():调用此方法会一直阻塞当前线程,直到计时器的值为0.

代码改成:

public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        int threadNum = 10;
        final  CountDownLatch countDownLatch = new CountDownLatch(threadNum);
        long start = System.currentTimeMillis();
        /*
        下面这么写是有问题的,因为这是多线程,当main线程执行完了,其他线程还没执行完,
        代码就已经到end那了,这样时间就不对了,算的只是main线程的时间。
         */
        for (int i = 0; i <10 ; i++) {
          new Thread(new Runnable() {
            @Override
              public void run() {
                  for (int i = 0; i < 1000000; i++) {
                    TestDcl dcl=TestDcl.getInstance();
                  }
                countDownLatch.countDown();
              }
           }).start();
        }
        countDownLatch.await();
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end-start));

    }
}

可以拿5种方式来试一遍,通过比较,会发现懒汉式是最慢的,其他差不多,因为懒汉式有用到同步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值