1.線程狀態

如上圖,當我們新建一個線程,并start后,其實不一定會馬上執行,因為只有操作系統調度了我們的線程,才能真正進行執行,而操作系統也隨時可以運行其他線程,這時線程又回到可運行狀態。這個過程是操作系統控制的,不是我們能控制的。我們能控制的是將線程變為blocked,并從blocked變為runable狀態。
在以前實驗的wait和notify中,我當時并沒有注意到notify后會進行鎖階段,以為notify后直接進入runable狀態,等待操作系統調度。 從上面的圖中可以看到,我們notify后,實際現場進入了locked狀態,一個線程時就直接進入runable狀態了,但是在多線程的情況下,因為我們wait或者notify時都是在同步中做的,只有獲得同步鎖的線程才有機會進入runable,其他線程還得等待。
因此在這里主要是學習一下鎖的原理
2.鎖
1).內置鎖
java的每個對象都可以用作一個同步鎖,這個鎖就是內置鎖,或者監視鎖,通過同步方法或者代碼塊獲得內置鎖,也就是運用synchronized關鍵字字
2).顯示鎖
jdk提供的高級鎖,比如Lock、Condition等,主要用于內置鎖不方便實現的功能
3.鎖的一些特性
1).可重入
java線程時基于每線程計算鎖的,在同一個線程中,可以再次進入該同步方法,而不會造成死鎖。進入一次計數器加1,退出后減1。
/** * 同步方法 * @author tomsnail * @date 2015年4月18日 下午12:15:30 */ public synchronized void test1(){ test1(); }2).公平/非公平
在公平的情況下,所有需要獲得鎖的線程,都有相同幾率獲得鎖,反之,某些線程可以優先獲得鎖。
/** * Creates an instance of {@code ReentrantLock}. * This is equivalent to using {@code ReentrantLock(false)}. */ public ReentrantLock() { sync = new NonfairSync(); } /** * Creates an instance of {@code ReentrantLock} with the * given fairness policy. * * @param fair {@code true} if this lock should use a fair ordering policy */ public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }ReentrantLock鎖的構造方法,就提供了公平/非公平的機制,而synchronized沒有明確的公平/非公平性保證,因為是操作系統就行調度的。公平鎖和非公平鎖的具體實現和原理,以后再好好學習一下。
4.死鎖
java因為是線程級別的,我借用進程的死鎖:是指多個線程循環等待其他線程占用的資源而無限期的僵持下去的局面。
死鎖產生的必要條件:
a).互斥條件
某個資源在一段時間內,只能由一個線程占用
b).不可搶占條件
在該資源沒有被釋放前,其他線程不能搶占
c).占用且申請條件
該線程已經占有一個資源,但是又申請新的資源,但要申請的資源被其他線程占用
d).循環等待條件
多個線程等待其他線程釋放資源
public class DeadLockThread { static final String a = "a"; static final String b = "b"; public static void main(String[] args) { Thread a = new Thread(new DeadLockThread1()); Thread b = new Thread(new DeadLockThread2()); a.start(); b.start(); }}class DeadLockThread1 implements Runnable{ @Override public void run() { testb(); } public void testa(){ synchronized (DeadLockThread.a) { System.out.PRintln(DeadLockThread.a); } } public void testb(){ synchronized (DeadLockThread.b) { System.out.println(DeadLockThread.b); testa(); } } }class DeadLockThread2 implements Runnable{ @Override public void run() { testa(); } public void testa(){ synchronized (DeadLockThread.a) { System.out.println(DeadLockThread.a); testb(); } } public void testb(){ synchronized (DeadLockThread.b) { System.out.println(DeadLockThread.b); } } }當上面四個條件同時滿足時,就會產生死鎖。
當產生死鎖的時候,我們破壞掉上面的四個條件就可以了。
新聞熱點
疑難解答