java中線程的理解

線程狀態

  1. 初始(NEW):新建立了一個線程對象,但尚未調用start()方法。
  2. 運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態籠統的稱爲「運行」。線程對象建立後,其餘線程(好比main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取CPU的使用權,此時處於就緒狀態(ready)。
  3. 就緒狀態的線程在得到CPU時間片後變爲運行中狀態(running)。 
  4. 阻塞(BLOCKED):表示線程阻塞於鎖。
  5. 等待(WAITING):進入該狀態的線程須要等待其餘線程作出一些特定動做(通知或中斷)。
  6.  超時等待(TIMED_WAITING):該狀態不一樣於WAITING,它能夠在指定的時間後自行返回。
  7.  終止(TERMINATED):表示該線程已經執行完畢。

   


 

線程建立方式

  1. 繼承Thread類(真正意義上的線程類)重寫run方法,是Runnable接口的實現。
  2. 實現Runnable接口,重寫run方法。
  3. 經過線程池建立線程
   ps:推薦使用第二種,畢竟java單繼承多實現,擴展性強

 


 

線程同步方法

  1. 使用同步方法(有synchronized關鍵字修飾的方法)
  2. 使用同步代碼塊(有synchronized關鍵字修飾的語句快)
  3. 使用重入鎖實現線程同步(ReentrantLock類)
  4. 使用特殊域變量(volatile)實現同步(每次從新計算,安全但並不是一致)
  5. 使用局部變量實現線程同步(ThreadLocal)以空間換時間
  6. 使用原子變量實現線程同步(AtomicInteger(樂觀鎖))
  7. 使用阻塞隊列實現線程同步(BlockingQueue (經常使用)add(),offer(),put())
   ps:前面5種同步方式都是在底層實現的線程同步,在實際開發中應當儘可能遠離底層結構。

 


 

概念我的理解

  1. 同步:就是代碼順序執行,執行到同步方法時,無論其有沒有返回值都要執行完,再往下執行。
  2. 異步:就是代碼執行到異步方法時,應該是由另一個線程來執行(執行結果如何,當前線程無論),當前線程往下順序執行代碼。
  3. 阻塞:是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
  4. 非阻塞:在不能馬上獲得結果以前,該調用不會阻塞當前線程。
  5. 線程安全:多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時進行保護, 其餘線程不能進行訪問直到該線程讀取完,其餘線程纔可以使用。不會出現數據不一致或者數據污染。
  6. 線程不安全:不提供數據訪問保護,有可能出現多個線程前後更改數據形成所獲得的數據是髒數據。
相關文章
相關標籤/搜索