测试 多线程 环境下,5种创建单例模式的效率
package java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习;
import java.util.concurrent.CountDownLatch;
import java_226_GOF23设计模式_单例模式_应用场景_饿汉模式_懒汉模式_练习.SingletonDemo01;
import java_226_GOF23设计模式_单例模式_应用场景_饿汉模式_懒汉模式_练习.SingletonDemo02;
import java_227_GOF23设计模式_单例模式__双重检查锁式_静态内部类模式_枚举式_UML_类图_练习.SingletonDemo03;
import java_227_GOF23设计模式_单例模式__双重检查锁式_静态内部类模式_枚举式_UML_类图_练习.SingletonDemo04;
/**
-
测试 多线程 环境下,5种创建单例模式的效率
*/
public class Client04 {public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();//获取当前时间 //注意:这里只是计算main线程的开始与结束时间;有可能main线程结束了而其他线程还没结束;时间就不准确; //第二种方法 CountDownLatch闭锁 int threadNum = 10;//threadNum线程数 final CountDownLatch countDownLatch = new CountDownLatch(threadNum);//注意:加final变成常量 for(int i=0;i<10;i++){//多个循环 new Thread(new Runnable(){//匿名内部类;以参数的形式传进来 public void run() {//run运行 //这是一个循环 //调用相关方法 for(int i=0;i<100000;i++){ //Object o = SingletonDemo01.getInstance(); //Object o2 = SingletonDemo02.getInstance(); //Object o3 = SingletonDemo03.getInstance(); //Object o4 = SingletonDemo04.getInstance(); Object o5 = SingletonDemo05.INSTANCE; } countDownLatch.countDown();//countDown倒数计秒;这里报错是因为内部类不能直接使用外部类的局部变量; //内核的局部变量与外部变量生命周期是不一样的;所以要加final 变成常量 } }).start();//start开始 } //第一种方式循环检测其他线程是否结束;老师没做; //阻塞;等待 countDownLatch.await();//await等待;main线程阻塞,直到计数器为0,才会往下执行; long end = System.currentTimeMillis();//获取结束时间 System.out.println("总耗时:"+( end -start));
}
}
//---------------------------------------------