我從擴展Thread類的類A創建了兩個線程a1
,a2
。類A聲明瞭兩個同步的構造函數和run方法。當我以這種形式編寫的代碼兩個線程有時開始在同一時間雖然run
方法聲明爲synchronized和我得到的結果一樣java中的同步關鍵字
0 0 1 1 2 3 4 5 6 7 2 8 3 9 4 10 5 11 6 12 7 8 9 10 11 12
代碼:
public class Main {
public static void main(String[] args) {
A t = new A() ;
A a1 = new A (t) ;
A a2 = new A (t) ;
a1.start();
a2.start();
}
}
class A extends Thread {
public A() {
super() ;
}
public A(Thread th) {
super(th) ;
}
@Override
public synchronized void run() {
for (int i = 0; i <13; i++) {
System.out.print(i+" ");
}
}
}
但是,當我通過創建Thread類不是A兩個線程,
Thread a1 = new Thread (t);
Thread a2 = new Thread (t);
同步方法run
工作,兩個線程不會在開始同時總是給結果
0 1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 10 11 12
我的問題:爲什麼synchronized關鍵字,當我創建A級兩個線程(雖然我定義了兩個構造函數)不工作,工作時,我創建Thraed類兩個線程?
您如何看到第一種情況下的線程在同一時間開始?你看到混合輸出嗎?你能告訴我們那個輸出嗎? –
我可以向你保證'synchronized'確實能正常工作。你正在同步線程對象本身,這真的有點沒有意義。 –
我的朋友同步始終正常工作。現在你的錯誤是在這裏理解**線程a1 =新線程(t);線程a2 =新的線程(t); **小的描述=在這裏你創建兩個不同的對象有兩個不同的鎖權利?所以爲什麼一個線程會等待你有這個?兩個線程都有不同的鎖定。得到它了? –