写一段代码来测试:
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种方式来试一遍,通过比较,会发现懒汉式是最慢的,其他差不多,因为懒汉式有用到同步。