1. 程式人生 > >java多執行緒之鎖機制二

java多執行緒之鎖機制二

網上看到一個題目,題目是這樣:Java多執行緒,啟動四個執行緒,兩個執行加一,另外兩個執行減一。

針對該問題寫了一個程式,測試通過,如下:

class Sync {  
	static int count = 0;
	  
    public void add() {  
        synchronized (Sync.class) {  
            System.out.println("test開始..");  
            count++;
            System.out.println("count = "+count);
            System.out.println("test結束..");  
        }  
    }  
    
    public void sub() {  
        synchronized (Sync.class) {  
            System.out.println("test開始..");  
            count--;
            System.out.println("count = "+count);
            System.out.println("test結束..");  
        }  
    }  
}  
  
class MyThread extends Thread {
	int operation = 0;
    public MyThread(int operation) {
		this.operation = operation;
	}


	public void run() { 
        Sync sync = new Sync();  
        if(operation==0){
        	sync.sub();
        }else if(operation==1){
        	sync.add();  
        }
        
    }  
}  
  
public class Main {  
  
    public static void main(String[] args) {  
    	//t1,t2做加法
        Thread t1 = new MyThread(1);  
        Thread t2 = new MyThread(1);  
        //t3,t4做減法
        Thread t3 = new MyThread(0);  
        Thread t4 = new MyThread(0);  
        t1.start();  
        t2.start();  
        t3.start();  
        t4.start();  
      
    }  
}  

輸出結果:

test開始..
count = 1
test結束..
test開始..
count = 0
test結束..
test開始..
count = 1
test結束..
test開始..
count = 0
test結束..

分析:執行緒t1,t2執行加法操作,執行緒t3,t4執行減法操作。在該程式中有兩個需要注意的點:

1.變數count必須定義為靜態型別static,因為如果不是定義成static,則雖然4個執行緒鎖住的是同一個物件,但是他們操作的count確實從屬於不同的sync例項,因為每個執行緒的sync是執行緒內部建立的,而不是從外界統一注入,由於每個執行緒操作的count分屬不同sync例項,導致結果具有隨機性。count定義為static後,多個執行緒操作的count為Sync類的靜態變數count,共享,結果為0.
2.這種實現的方式是一種比較低效的方式,分析程式碼,add()方法和sub()方法的鎖物件也是相同的,即有一個執行緒在執行add()方法時,其他執行緒除了不能執行同步方法add()以外,sub()方法也不能執行,這是因為使用的全域性鎖,一個同步方法執行時,其他所有的同步方法都不能執行。