Java關鍵字synchronized

     參考:Java中synchronized的用法


看了下線程的基本概念和一些常用方法的使用,在銀行存取款、生產者消費者問題時對synchronized總是不能很好的理解。

請編寫一個類,類名爲SubThread,是Thread 類的子類。該類中定義了含一個字符串參數的構造方法和run()方

法,方法中有一個for循環,循環一共進行5次,循環體先在命令行顯示該線程循環了第幾次,然後隨機休眠小於

一秒的時間,循環結束後顯示線程結束信息:線程名+finished 。 編寫一個Application程序,並在其中創建S

ubThread類的三個線程對象T1,T2,T3, 他們的名稱分別爲Frist,Second,Third,並啓動這三個線程。

  public class Application {
public static void main(String[] args){
SubThread t1 = new SubThread("first");
SubThread t2 = new SubThread("second");
SubThread t3 = new SubThread("third");
t1.start();
t2.start();
t3.start();
}
}


class SubThread extends Thread{
int count = 0;//計數
SubThread(String name){
super(name);
}
@Override
public void run(){
synchronized(this){
for(int i =0;i<5;i++){
count++;
System.out.println("線程"+this.currentThread().getName()+"循環第"+count+"次");
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("線程"+this.currentThread().getName()+"    "+"finished");
}
}
}

按照題目的要求敲出來運行結果明顯不對,在想是不是哪裏沒鎖死,synchronized(this)這個this不是當前對象嗎,一個線程運行,這個對象在run()

方法裏被鎖死,要等這個運行完才結束一個線程。這樣越想越想不通。在網上找到這個synchronized的用法,總結的很好,從中收穫了很多,非常感謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章