多线程-单例模式涉及的多线程安全问题

 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 }
SingleDemo

 

posted @ 2021-11-10 15:41  doremi429  阅读(15)  评论(0编辑  收藏  举报