懒汉单例、线程不安全测试实例

This commit is contained in:
2018-09-24 11:03:15 +08:00
parent 529d8fef53
commit a2740cacb5
3 changed files with 103 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
package top.fjy8018.designpattern.pattern.creational.singleton;
import lombok.extern.slf4j.Slf4j;
/**
* 懒汉式单例:延迟加载(线程不安全)
*
* @author F嘉阳
* @date 2018-09-24 10:29
*/
@Slf4j
public class LazySingleton {
private static LazySingleton lazySingleton = null;
/**
* 单例模式构造器必须是屏蔽的
*/
private LazySingleton() {
}
/**
* 线程不安全
*
* @return
*/
public static LazySingleton getInstance() {
if (lazySingleton == null) {
log.debug("LazySingleton实例化");
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
/**
* 线程不安全验证
*
* @return
*/
public static LazySingleton getInstance2() throws InterruptedException {
if (lazySingleton == null) {
// 使用线程等待模拟复杂实例化过程,让多线程同时进入该方法
Thread.sleep(1000);
log.debug("LazySingleton实例化");
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}

View File

@@ -0,0 +1,21 @@
package top.fjy8018.designpattern.pattern.creational.singleton;
import lombok.extern.slf4j.Slf4j;
/**
* @author F嘉阳
* @date 2018-09-24 10:53
*/
@Slf4j
public class MyRunnable implements Runnable {
@Override
public void run() {
LazySingleton lazySingleton = null;
try {
lazySingleton = LazySingleton.getInstance2();
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(Thread.currentThread().getName() + " " + lazySingleton);
}
}

View File

@@ -0,0 +1,34 @@
package top.fjy8018.designpattern.pattern.creational.singleton;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@Slf4j
class LazySingletonTest {
/**
* 懒汉式注重延迟加载,当使用时才实例化
* 可以使用多线程测试方法或者通过多线程Debug方式测试
*/
@Test
void getInstanceOneThread() {
LazySingleton lazySingleton = LazySingleton.getInstance();
}
@Test
void getInstanceMutilThread() throws InterruptedException {
Thread thread1 = new Thread(new MyRunnable());
Thread thread2 = new Thread(new MyRunnable());
thread1.start();
thread2.start();
Thread.sleep(3000);
log.debug("finish");
}
}