/**
*
* @title SingletonTest
* @describe 测试多线程环境下五种创建单例模式的效率
* @author 张富昌
* @date 2017年3月27日上午9:24:58
*/
public class SingletonTest {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
int threadNum = 10;
// A synchronization aid that allows one or more threads to wait until a
// set of operations being performed in other threads completes.
// 计数器(一个线程执行完成就减1)
final CountDownLatch countDownLatch = new CountDownLatch(threadNum);
for (int i = 0; i < threadNum; i++) {
// 多线程测试
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000000; i++) {
// 饿汉式,
// Object o = Singleton01.getInstance();
// 懒汉式,最慢
// Object o = Singleton02.getInstance();
// 双重检测锁式,不稳定,不建议使用
// Object o = Singleton03.getInstance();
// 静态内部类
// Object o = Singleton04.getInstance();
// 枚举式
Object o = Singleton05.INSTANCE;
}
// 一个线程执行完成就减1
countDownLatch.countDown();
}
}).start();
}
// 阻塞
countDownLatch.await(); // main线程阻塞,直到计数器变为0,才会继续往下执行!
long end = System.currentTimeMillis();
System.out.println("总耗时:" + (end - start));
}
}
四、什么是线程安全?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。