在併發中有兩種方式,一是多進程,二是多線程,可是線程相比進程花銷更小且能共享資源。編程
線程帶來的風險:安全
1. 安全性問題。錯誤的問題永不發生。競態條件(順序敏感)。多線程
2. 活躍性問題。正確的事情必定會發生。死循環,死鎖。併發
3. 性能問題。正確的事情儘快發生。服務時間過長,響應不靈敏,吞吐率太低性能
定義:安全性問題的含義是「永遠不發生糟糕的事情」spa
緣由:內存共享,指令重排序,並行運行,操做順序不可預測,將會在串行編程模型中引入非串行因素,產生奇怪的結果。便利的同時有風險,很難分析。線程
常見:有一種常見的併發安全問題叫「競態條件」。 設計
/** 一、什麼是競態條件? 當兩個線程競爭同一資源時,若是對資源的訪問順序敏感,就稱存在競態條件。 致使競態條件發生的代碼區稱做臨界區。 在臨界區中使用適當的同步就能夠避免競態條件。 臨界區實現方法有兩種,一種是用synchronized,一種是用Lock顯式鎖實現。 */
線程會致使一些在單線程程序中不會出現的問題,那就是活躍性問題。code
活躍性則關注另一個目標:「某件正確的事情最終會發生」。當某個操做沒法繼續執行下去時,就會發生活躍性問題。blog
在串行程序中,活躍性問題的一種就是無心中形成的無限循環,使得不能按照設計的工做進行,執行不到後面的代碼。或者因爲資源競爭而致使的死鎖等。
活躍性意味着某件正確的事情會中會發生,但卻不夠好,由於咱們但願正確的事情儘快發生。
性能問題包括多個方面,例如服務時間過長,響應不靈敏,吞吐率太低等等。
因此多線程須要良好的設計來提高線程的性能,但不管如何線程總會帶來額外的開銷,因爲多線程之間的調度會頻繁地出現上下文切換操做,保存和恢復執行上下文,線程之間共享數據時須要同步等等。