【線程,大廠程序員35歲後的職業出路在哪

程序員小安卓 2021-09-20 00:17:44 阅读数:961

程序 出路 在哪

【線程,大廠程序員35歲後的職業出路在哪_後端

餓漢式顧名思義,就是這個漢子很餓,一上來就把單例對象創建出來了,要用的時候直接返回即可,這種是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單例在還沒有使用到的時候,初始化就已經完成了。如果程序從頭到比特都沒用使用這個單例的話,單例的對象還是會創建,這就造成了不必要的資源浪費。

2.懶漢模式(線程不安全)[不可用]


/**
* 單例模式——懶漢模式
*/
public class ThreadDemo15 {
static class Singleton{
//將構造函數設置為私有
private Singleton(){}
//設置一個私有屬性,並且不會對它進行賦值
private static Singleton instance = null;
public static Singleton getInstance(){
//對其進行判斷,當為空的時候再去創建一個對象
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
public static void main(String[] args) {
//切記不能使用Singleton singleton1 = new Singleton(),這樣之後來調用getInstance方法,
// 因為一旦new就會產生新的對象
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2);
}
}

  • 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.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.

優點:如果真實使用的情况下才會創建資源,如果沒人調用就可以省略創建的對象的步驟了

注意:

這種寫法起到了懶加載的效果,但只能在單線程下使用。如果在多線程下,一個線程進入了 if (instance == null) 判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例。所以在多線程環境下不可使用這種方式。

—————————————————————————————————————————

[](

)餓漢模式和懶漢模式的線程安全問題


(一個線程)單線程是不存在線程安全的

首先要知道影響線程安全的五個因素:

a)搶占式

b)多個線程修改同一個變量

c)內存可見性

d)原子性

e)編譯器優化

而這裏面我們從原子性的角度去分析

1.餓漢模式

【線程,大廠程序員35歲後的職業出路在哪_程序員_02

2.懶漢模式

【線程,大廠程序員35歲後的職業出路在哪_後端_03

2.1.懶漢模式(線程安全,但是不推薦使用)

【線程,大廠程序員35歲後的職業出路在哪_Java_04

————————————————————————————

2.2.懶漢模式(同步代碼塊,線程安全,但是不可用)

【線程,大廠程序員35歲後的職業出路在哪_Java_05

但是這種同步並不能起到線程同步的作用。假如一個線程進入了 if (instance == null) 判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例。

2.3.懶漢模式雙重校驗鎖

雙檢索模式,進行了兩次判斷,第一次判斷時為了避免不要的實例,第二次是為了進行線程同步,避免多線程問題。

由於 new Singleton()創建對象的時候jvm中可能會重新排序,在多線程下存在風險,使用volatile關鍵字可以當線程改變其值後通知其他線程改變並且不會被jvm重新排序,解决該問題。


static class Singleton{
private Singleton(){}
private static volatile Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
# 最後
**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】](https://ali1024.coding.net/public/P7/Java/git)**
學習視頻:
![【線程,大廠程序員35歲後的職業出路在哪_程序員_06](https://s7.51cto.com/images/20210920/1632067648574168.jpg)
大廠面試真題:
![【線程,大廠程序員35歲後的職業出路在哪_程序員_07](https://s9.51cto.com/images/20210920/1632067649699009.jpg)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
版权声明:本文为[程序員小安卓]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920001743891h.html