1 package multithread.test;
2
3
4 /*
5 * 多线程下的单例
6 *
7 *
8 */
9 //饿汉式(单例设计模式)
10 class Single {
11 private static final Single s = new Single();
12 private Single() {}
13 public static Single getInstance() {
14 return s;
15 }
16 }
17 //懒汉式(延迟加载单例设计模式)
18 class Single {
19 private static Single s = null;
20
21 private Single() {}
22 public static /*synchronized*/ Single getInstance() {//加同步会解决线程安全问题,但会影响效率每次线程过来都要判断锁,所以用同步代码块
23 if(s == null) {//多加一步判断是为了解决效率问题
24 synchronized(Single.class) {//不能用this 和this.getClass()因为这是非静态的
25 if(s==null) {
26 // -->0 -->1 //可能都判断过if了 不保证唯一了两个对象,在多线程就不行了
27 s = new Single();
28 }
29
30 }//加锁是为了解决线程安全问题
31 }
32
33 return s;
34
35 }
36 }
37 public class SingleDemo {
38
39 public static void main(String[] args) {
40 // TODO Auto-generated method stub
41
42 }
43
44 }