java并发编程实践(1)intro
生活随笔
收集整理的這篇文章主要介紹了
java并发编程实践(1)intro
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
0.1)本文部分文字描述轉自“java并發編程實踐”,旨在學習“java并發編程實踐(1)intro”的相關知識;
【3】線程帶來的風險 【3.1】安全性問題 1)intro:在沒有充足同步的case下,多個線程的操作執行順序是不可預測的; 2)看個荔枝: public class UnsafeSequence {private int value;public int getNext(){return value++;} } 對以上代碼的分析(Analysis):上述類的問題在于:如果執行時機不對,那么兩個線程在調用 getNext方法時會得到相同的值;如下圖所示:
對上圖的分析(Analysis): A1)雖然遞增運算 value++ 看上去是單個操作,但事實上它包含3個獨立的操作:讀取value,將value加1,并將計算結果寫入value;由于運行時可能將多個線程之間的操作交替執行,因此這兩個線程可能同時執行讀操作,從而使得他們得到相同的值,并都將這個值加1.結果就是,在不同線程的調用中返回了相同的數值; A2)上面的交替執行示意圖給出的是最糟糕的執行case:目的是為了說明,如果錯誤地假設程序中的操作將按照某種特定順序來執行,那么會存在各種可能的危險; A3)在UnsafeSequence類中說明的是一種常見的并發安全問題,稱為競態條件;因為在剛剛的荔枝中,getValue()方法是否返回唯一值,要取決于運行時對線程中操作的交替執行方式,這并不是我們希望看到的case;(干貨——引入競態條件)
3)由于多個線程要共享相同的內存地址空間,并且是并發運行,因此它們可能會訪問或修改其他線程正在使用的變量; 4)當多個線程同時訪問和修改相同變量時,將會在串行編程模型中引入非串行因素,而這種非串行性是很難分析的。要使多線程程序的行為可以預測,必須對共享變量的訪問操作進行協同,這樣才不會在線程之間發生彼此干擾。幸運的是,java 提供了各種同步機制來協同這種訪問;(干貨——引入對共享變量的協同訪問操作) 看個荔枝)線程安全的數值序列生成器 public class SafeSequence {private int value;public synchronized int getNext(){return value++;} }【3.2】活躍性問題 1)定義:某件正確的事情最終會發生; 2)安全性的含義是:永遠不發生最糟糕的事情,而活躍性則關注與另一個目標,即“某件正確的事情最終會發生” 3)當某個操作無法繼續執行下去時,就會發生活躍性問題。在串行程序中,活躍性問題的形式之一是無意中造成的無限循環,從而使得循環之后的代碼無法得到執行。 4)線程將帶來一些其他活躍性問題:如,如果線程A在等待線程B 釋放其特有的資源,而線程B永遠都不釋放該資源,那么A 就會永久地等待下去;
【3.3】性能問題 1)intro:希望正確的事情盡快發生,講究的是效率; 2)性能問題包括多個方面:如服務時間過長,響應不靈敏,吞吐率過低,資源消耗過高,或者可伸縮性較低等; 3)線程總會帶來某種程度的運行時開銷:在多線程程序中,當線程調度器臨時掛起活躍線程并轉而運行另一個線程時,就會頻繁地出現上下文切換操作,這種操作將帶來極大的開銷,保存和回復執行上下文,丟失局部性,并且CPU 時間將更多地花在線程調度而不是線程運行上;(干貨——一個常見的荔枝,當跑hadoop的時候,發現單節點比多節點用的時間還少,就是這個原因,因為不斷進行上下文切換,會帶來極大的性能開銷)
【3】線程帶來的風險 【3.1】安全性問題 1)intro:在沒有充足同步的case下,多個線程的操作執行順序是不可預測的; 2)看個荔枝: public class UnsafeSequence {private int value;public int getNext(){return value++;} } 對以上代碼的分析(Analysis):上述類的問題在于:如果執行時機不對,那么兩個線程在調用 getNext方法時會得到相同的值;如下圖所示:
對上圖的分析(Analysis): A1)雖然遞增運算 value++ 看上去是單個操作,但事實上它包含3個獨立的操作:讀取value,將value加1,并將計算結果寫入value;由于運行時可能將多個線程之間的操作交替執行,因此這兩個線程可能同時執行讀操作,從而使得他們得到相同的值,并都將這個值加1.結果就是,在不同線程的調用中返回了相同的數值; A2)上面的交替執行示意圖給出的是最糟糕的執行case:目的是為了說明,如果錯誤地假設程序中的操作將按照某種特定順序來執行,那么會存在各種可能的危險; A3)在UnsafeSequence類中說明的是一種常見的并發安全問題,稱為競態條件;因為在剛剛的荔枝中,getValue()方法是否返回唯一值,要取決于運行時對線程中操作的交替執行方式,這并不是我們希望看到的case;(干貨——引入競態條件)
3)由于多個線程要共享相同的內存地址空間,并且是并發運行,因此它們可能會訪問或修改其他線程正在使用的變量; 4)當多個線程同時訪問和修改相同變量時,將會在串行編程模型中引入非串行因素,而這種非串行性是很難分析的。要使多線程程序的行為可以預測,必須對共享變量的訪問操作進行協同,這樣才不會在線程之間發生彼此干擾。幸運的是,java 提供了各種同步機制來協同這種訪問;(干貨——引入對共享變量的協同訪問操作) 看個荔枝)線程安全的數值序列生成器 public class SafeSequence {private int value;public synchronized int getNext(){return value++;} }【3.2】活躍性問題 1)定義:某件正確的事情最終會發生; 2)安全性的含義是:永遠不發生最糟糕的事情,而活躍性則關注與另一個目標,即“某件正確的事情最終會發生” 3)當某個操作無法繼續執行下去時,就會發生活躍性問題。在串行程序中,活躍性問題的形式之一是無意中造成的無限循環,從而使得循環之后的代碼無法得到執行。 4)線程將帶來一些其他活躍性問題:如,如果線程A在等待線程B 釋放其特有的資源,而線程B永遠都不釋放該資源,那么A 就會永久地等待下去;
【3.3】性能問題 1)intro:希望正確的事情盡快發生,講究的是效率; 2)性能問題包括多個方面:如服務時間過長,響應不靈敏,吞吐率過低,資源消耗過高,或者可伸縮性較低等; 3)線程總會帶來某種程度的運行時開銷:在多線程程序中,當線程調度器臨時掛起活躍線程并轉而運行另一個線程時,就會頻繁地出現上下文切換操作,這種操作將帶來極大的開銷,保存和回復執行上下文,丟失局部性,并且CPU 時間將更多地花在線程調度而不是線程運行上;(干貨——一個常見的荔枝,當跑hadoop的時候,發現單節點比多節點用的時間還少,就是這個原因,因為不斷進行上下文切換,會帶來極大的性能開銷)
總結
以上是生活随笔為你收集整理的java并发编程实践(1)intro的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔上架新款游匣 G15 游戏本:i5-
- 下一篇: 微星 Z790 EDGE TI MAX