Java 併發系列之十一:併發線程帶來的風險

1. 概述

在併發中有兩種方式,一是多進程,二是多線程,可是線程相比進程花銷更小且能共享資源。編程

線程帶來的風險:安全

1. 安全性問題。錯誤的問題永不發生。競態條件(順序敏感)。多線程

2. 活躍性問題。正確的事情必定會發生。死循環,死鎖。併發

3. 性能問題。正確的事情儘快發生。服務時間過長,響應不靈敏,吞吐率太低性能

2. 安全性問題

  定義:安全性問題的含義是「永遠不發生糟糕的事情」spa

  緣由:內存共享,指令重排序,並行運行,操做順序不可預測,將會在串行編程模型中引入非串行因素,產生奇怪的結果。便利的同時有風險,很難分析。線程

  常見:有一種常見的併發安全問題叫「競態條件」。 設計

/**
一、什麼是競態條件?

    當兩個線程競爭同一資源時,若是對資源的訪問順序敏感,就稱存在競態條件。

    致使競態條件發生的代碼區稱做臨界區。

    在臨界區中使用適當的同步就能夠避免競態條件。

    臨界區實現方法有兩種,一種是用synchronized,一種是用Lock顯式鎖實現。
*/

 

3. 活躍性問題

    線程會致使一些在單線程程序中不會出現的問題,那就是活躍性問題。code

    活躍性則關注另一個目標:「某件正確的事情最終會發生」。當某個操做沒法繼續執行下去時,就會發生活躍性問題。blog

    在串行程序中,活躍性問題的一種就是無心中形成的無限循環,使得不能按照設計的工做進行,執行不到後面的代碼。或者因爲資源競爭而致使的死鎖等。

 

4. 性能問題

    活躍性意味着某件正確的事情會中會發生,但卻不夠好,由於咱們但願正確的事情儘快發生

    性能問題包括多個方面,例如服務時間過長,響應不靈敏,吞吐率太低等等。

    因此多線程須要良好的設計來提高線程的性能,但不管如何線程總會帶來額外的開銷,因爲多線程之間的調度會頻繁地出現上下文切換操做,保存和恢復執行上下文,線程之間共享數據時須要同步等等。

相關文章
相關標籤/搜索