標籤:span 通過 共用記憶體 ota 進程與線程 多次 讀取 加鎖 系統
進程是程式(任務)的執行過程,具有動態性;持有資源(共用記憶體、共用檔案)和線程,是資源和線程的載體。
線程是系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。
線程的互動,互動的方式包括互斥與同步。
java對線程的支援主要體現在類Thread和介面Runnable,它們都繼承java.lang包,有一個共同的方法run()
- 線程停止錯誤的方法:stop()、interrupt()
- 線程停止的正確方法
public class ArmyRunnable implements Runnable { //volatile保證了線程可以正確讀取其他線程寫入的值 volatile boolean keepRunning = true; @Override public void run() { while(keepRunning) { //發動五連擊 for (int i = 0; i < 5 ; i++) { System.out.println(Thread.currentThread().getName() + "進攻對方[" + i + "]"); } //暫停 Thread.yield(); } System.out.println(Thread.currentThread().getName() + "結束了戰鬥"); }}
當多個線程同時共用訪問同一資料(記憶體地區)時,每個線程都嘗試操作該資料,從而導致資料被破壞(corrupted),這種現象稱為競爭條件。
互斥:在同一時間,只能有一條線程去對我們的關鍵資料或臨界區進行操作。
互斥的實現:sysnchronized(intrinsic lock),sysnchronized相當於給代碼加上一把鎖,使其他線程不能進入這個關鍵地區訪問我們的關鍵資源。
同步:是線程之間的一種通訊機制, 由於一條線程的某些條件不具備,使得其他線程處於某種等待的狀態,之後由於條件具備了,一條線程會用某種方式喚醒其他的線程。
同步的實現:wait()/notify()/notifyAll()--Object對象的成員方法
wait set 是線程的休息室
public void transfer(int from, int to, double amount) { //通過synchronized 關鍵字來實現互斥,synchronized既可以出現在方法之上,也能以塊的形式出現在方法體之中 //通過對lockObj加鎖實現互斥 //加鎖操作是有開銷的,多次加鎖操作會降低系統的效能 synchronized (lockObj) {//while迴圈,保證條件不滿足時任務都會被條件阻擋,而不是繼續競爭CPU資源 while (energyBoxes[from] < amount) { try { //條件不滿足,將當前線程放入鎖對象(lockObj)上的wait set //wait set 是線程的休息室 lockObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); energyBoxes[from] -= amount; System.out.printf("從%d轉移%10.2f單位能量到%d", from, amount, to); energyBoxes[to] += amount; System.out.printf("能量總和:%10.2f%n",getTotalEnergies()); //喚醒所有在lockObj對象上等待的線程 lockObj.notifyAll(); } }
Java Memory Mode
Locks & Condition
執行緒安全性: 原子性與可見度 ...
多線程編程常用的互動模型
Java5中並發編程工具
core java
Java concurrency in practice
Java—進程與進程