一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 完美解決單例設計模式中懶漢式線程安全的問題

完美解決單例設計模式中懶漢式線程安全的問題

2020-07-19 12:27JAVA之家 Java教程

下面小編就為大家帶來一篇完美解決單例設計模式中懶漢式線程安全的問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

首先寫個單例:

?
1
2
3
4
5
6
7
8
9
10
public class SingleDemo {
  private static SingleDemo s = null;
  private SingleDemo(){}
  public static SingleDemo getInstance(){
    if(s == null){
      s = new SingleDemo();
    }
    return s;
  }
}

 

寫個測試類:

?
1
2
3
4
5
6
7
8
public class ThreadDemo3 {
   
  public static void main(String[] args) {
    SingleDemo s1 = SingleDemo.getInstance();
    SingleDemo s2 = SingleDemo.getInstance();
    System.out.println(s2 == s2);
  }
}

 

運行結果一直都是true,說明單線程下是沒問題的,下面寫個多線程來訪問單例

?
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
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);
  }
}

 


運行結果如下:
[com.persagy.thread.SingleDemo@1bc4459, com.persagy.thread.SingleDemo@150bd4d]

[com.persagy.thread.SingleDemo@12b6651]

說明有線程并發訪問安全問題,獲取的不一定都是同一個實例

如何解決線程安全問題呢?

當然使用同步鎖機制了啊

下面改進單例:

?
1
2
3
4
5
6
7
8
9
10
public class SingleDemo {
    private static SingleDemo s = null;
    private SingleDemo(){}
    public static synchronized SingleDemo getInstance(){
        if(s == null){
            s = new SingleDemo();
        }
        return s;
    }
}

加入同步函數后線程安全問題解決了

運行多次都是獲取同一個實例,不會出現2個實例的情況了

[com.persagy.thread.SingleDemo@12b6651]

但是在多線程并發訪問的情況下,每個線程每次獲取實例都要判斷下鎖,效率比較低,為了提高效率,我加入了雙重判斷的方法,解決了效率的問題

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingleDemo {
    private static SingleDemo s = null;
    private SingleDemo(){}
    public static SingleDemo getInstance(){
        /*如果第一個線程獲取到了單例的實例對象,
         * 后面的線程再獲取實例的時候不需要進入同步代碼塊中了*/
        if(s == null){
            //同步代碼塊用的鎖是單例的字節碼文件對象,且只能用這個鎖
            synchronized(SingleDemo.class){
                if(s == null){
                    s = new SingleDemo();
                }
            }
        }
        return s;
    }
}

用這種方式解決了懶漢式的線程安全問題,也提高了效率,但是在實際開發中還是用餓漢式的比較多,畢竟這個代碼比較多,比較繁瑣。

以上就是小編為大家帶來的完美解決單例設計模式中懶漢式線程安全的問題全部內容了,希望大家多多支持服務器之家~

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一区二区视频 | 日韩毛片高清在线看 | 日本888 xxxx| 丝袜足液精子免费视频 | 福利视频一区二区三区 | 性夜影院爽黄A爽免费动漫 性色欲情网站IWWW九文堂 | 男女乱淫真视频播放网站 | 91免费在线播放 | 男女肉粗暴进来下面好紧 | 亚洲精品国产成人中文 | 拿捏小说 | 久久aa毛片免费播放嗯啊 | 国产精品馆| 国产麻豆在线观看网站 | 爆操俄罗斯美女 | 国产91精选学生在线观看 | 1769在线视频 | 大片毛片女女女女女女女 | 毛片亚洲毛片亚洲毛片 | 校草太大了h | 国产亚洲综合精品一区二区三区 | 特级毛片免费视频观看 | 双性np玩烂了np欲之国的太子 | 亚洲福利天堂 | 日韩不卡一区二区三区 | 久久精品观看 | 国产成+人+亚洲+欧美综合 | 娇妻与老头绿文小说系列 | 亚洲美女人黄网成人女 | 成人综合婷婷国产精品久久免费 | 日韩免费一区 | 国产精品久久久久久久久免费 | 黑人video粗暴日本 | 我的奶头被客人吸的又肿又红 | yellow高清视频日本动漫 | 国产精品久久久久久久免费大片 | 极品虎白女在线观看一线天 | 99精品国产成人一区二区 | 日本黄色录像视频 | 久久五月综合婷婷中文云霸高清 | 国产青草视频在线观看免费影院 |