1 package day2_4;
2
3 import org.junit.Test;
4
5 /**
6 * 单例设计模式
7 * 1.1是什么
8 * 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例
9 * 1.2 好处
10 * 由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源
11 * 时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时产生一个单例对象,然后永久
12 * 驻留内存的方式来解决
13 * <p>
14 * 2.如何实现?
15 * 饿汉式 vs 懒汉式
16 * <p>
17 * 3.区别
18 * 饿汉式:(可以看看Runtime源码)
19 * 坏处:提前把对象就创建好了,但是有可能很久才会用,或者一直也用不上,就导致对象加载时间过长
20 * 好处:线程安全的
21 * 懒汉式:
22 * 坏处:需要使用同步机制解决线程安全的问题
23 * 好处:延迟对象的创建,什么时候用就什么时候创建
24 */
25 public class SingletonTest {
26 @Test
27 public void test1() {
28 Bank bank1 = Bank.getInstance();
29 Bank bank2 = Bank.getInstance();
30 System.out.println(bank1);
31 System.out.println(bank2);
32 System.out.println(bank2 == bank1);
33 }
34
35 @Test
36 public void test2() {
37 Order Order1 = Order.getInstance();
38 Order Order2 = Order.getInstance();
39 System.out.println(Order1);
40 System.out.println(Order2);
41 System.out.println(Order2 == Order2);
42 }
43 }
44
45 //饿汉式(不管你用不用提前就创建好对象)
46 class Bank {
47 //2.内部创建类的对象
48 //4.要求此对象也必须声明为静态的(为了步骤3调用)
49 private static Bank instance = new Bank();
50
51 //1.私有化类的构造器
52 private Bank() {
53 }
54
55 //3.提供公共的静态方法,返回类的对象
56 public static Bank getInstance() {
57 return instance;
58 }
59 }
60
61 //懒汉式(用的时候才创建对象) 有线程安全问题
62 //class Order{
63 //
64 // private static Order instance = null;
65 //
66 // private Order(){
67 // }
68 //
69 // public static Order getInstance() {
70 // if (instance == null) {
71 // instance = new Order();
72 // }
73 // return instance;
74 // }
75 //}
76
77 //懒汉式(用的时候才创建对象) 需要解决线程安全问题
78 class Order {
79 private static Order instance = null;
80
81 private Order() {
82
83 }
84
85 //方式一:同步的静态方法,同步监视器是Order的类对象Order.class
86 // public static synchronized Order getInstance() {
87 // if (instance == null) {
88 // instance = new Order();
89 // }
90 // return instance;
91 // }
92
93 //方式二:同步代码块(Surround With(Ctrl+Alt+T快捷键 ))
94 // public static synchronized Order getInstance() {
95 // synchronized (Order.class) {
96 // if (instance == null) {
97 // instance = new Order();
98 // }
99 // return instance;
100 // }
101 // }
102
103 //上面两种方式都是正确的,但效率低点
104 //方式三:如果同步代码块中需要执行的操作比较多,下面的方式效率会高些
105 public static synchronized Order getInstance() {
106 //第一批第一个进入同步代码块的线程会不受干扰的创建对象,并返回这个对象
107 //后一批的线程在判断instance == null为false后,都不会再加入同步
108 // 代码块,这样效率更高!
109 if (instance == null) {
110 synchronized (Order.class) {
111 if (instance == null) {
112 instance = new Order();
113 }
114 }
115 }
116 return instance;
117 }
118 }