進程是程序(任務)的執行過程,具備動態性;持有資源(共享內存、共享文件)和線程,是資源和線程的載體。java
線程是系統中最小的執行單元,同一進程中有多個線程,線程共享進程的資源。數據庫
線程的交互,交互的方式包括互斥與同步。編程
java對線程的支持主要體如今類Thread和接口Runnable,它們都繼承java.lang包,有一個共同的方法run()安全
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至關於給代碼加上一把鎖,使其餘線程不能進入這個關鍵區域訪問咱們的關鍵資源。併發
同步:是線程之間的一種通訊機制, 因爲一條線程的某些條件不具有,使得其餘線程處於某種等待的狀態,以後因爲條件具有了,一條線程會用某種方式喚醒其餘的線程。ide
同步的實現: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