java多線程知識整理

 

java多線程知識整理 本文不是入門篇,僅記錄容易出錯的知識點

爲什麼需要多線程

根本原因:

  1. 同一段時間儘量做更多的事;
  2. 充分發揮CPU的功能,避免浪費CPU資源;
  3. 同一時間需要做不同的事;

多線程的核心問題

  1. 對同一個變量的讀寫,導致髒寫(數據庫事務概念);

  2. 多個線程相互協作,如何通信,比如線程A依賴線程B的某個資源

如果沒有特別的控制和機制,多個線程對同一個變量的讀寫,容易造成中間結果相互覆蓋的情形,

類似於數據庫事務中的髒寫

有時線程A的執行需要線程B的某個資源,或者等線程B執行完某個操作之後,才能往下執行.

競態條件

競態條件,說得通俗一點,就是線程A 需要判斷一個變量的狀態,然後根據這個變量的狀態來執行某個操作。 在執行這個操作之前,這個變量的狀態可能會被其他線程修改。

參考:http://hw1287789687.iteye.com/blog/2007134

多線程爭搶的是什麼資源?

  1. CPU資源;
  2. lock(ownership of this monitor/object's monitor)

獲取CPU資源,線程狀態 從就緒狀態進入運行狀態;

獲取 lock,則由blocked狀態進入就緒(runnable)狀態

容易弄混的

  1. 調用完wait()之後,會往下執行嗎?
    不會,會做兩件事 (1) 釋放鎖;
    (2)進入等待隊列;

  2. 線程A 先調用wait(),線程B 在同步代碼塊中調用 notifyAll(),線程A會馬上執行嗎? 不會.官網文檔:

The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution

B線程調用notifyAll() 之後,線程A 從等待隊列進入 鎖池,等待獲取同步鎖,並不會馬上執行.

  1. 可以任意執行wait()嗎?
    不可以,必須先獲取鎖,纔有資格執行wait().

Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0). The current thread must own this object's monitor.

哪些手段保證多線程的安全?

  1. 使用synchronized;
  2. 使用讀寫鎖

總結

java 多線程安全機制和數據庫事務的隔離級別 ,是一樣的套路,
java中,同一個時間片,只允許一個線程進入同步代碼塊,來保證安全;
數據庫事務中,通過共享讀鎖,排它鎖,行級所,表級鎖,來保證對於同一個表或同一行數據,只能有一個事務進入

參考:https://blog.csdn.net/evankaka/article/details/44153709
http://www.importnew.com/26850.html http://www.hollischuang.com/archives/943

 https://my.oschina.net/huangweiindex/blog/1919895

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章