一.使用java8lambd测试
main方法中:
IntStream.range(0,10).forEach(
i->new Thread(()->System.out.println(Thread.currentThread().getName()+"=====>>>>"+SingleTest.getInstance())).start());
二.使用Set集合验证
1 2 3 4 5 6 7 8 9 10 11 | public class ThreadTest implements Runnable { //存放单例对象,使用Set是为了不存放重复元素 public Set<SingleDemo> singles = new HashSet<SingleDemo>(); @Override public void run() { //获取单例 SingleDemo s = SingleDemo.getInstance(); //添加单例 singles.add(s); } } |
使用多线程并发访问单例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | public class ThreadDemo3 { public static void main(String[] args) { // SingleDemo s1 = SingleDemo.getInstance(); // SingleDemo s2 = SingleDemo.getInstance(); // System.out.println(s2 == s2); ThreadTest t = new ThreadTest(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); System.out.println(t.singles); } } //看不出结果改成下面这样 同时在懒汉式取单例方法中添加Thread.sleep(50);//让多个线程竞争 public class ThreadDemo3 { public static void main(String[] args) { // SingleDemo s1 = SingleDemo.getInstance(); // SingleDemo s2 = SingleDemo.getInstance(); // System.out.println(s2 == s2); ThreadTest t = new ThreadTest(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); try { Thread.sleep( 2000 );//让主线程等等子线程任务执行 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(t.singles); } } |