我知道那個問題「兩個同步方法是否同時執行」之前已經問過,答案是「否。只有一個線程可以保存該對象的鎖,然後它只是那個可以進入同步方法的線程那個對象。「 但是,如果其真正的話,請幫我理解下面的代碼輸出:類有2個同步方法..當一個線程在第二個方法裏面時另一個線程可以進入第一個方法嗎?
public class SynchronizationMistake {
public int count;
public synchronized int getCount()
{
return count;
}
public synchronized String incrementCount()
{
count++;
return"";
}
public static void main (String args[])
{
SynchronizationMistake syn = new SynchronizationMistake();
Thread first = new Thread(syn.new readIncrementCount(syn),"First");
Thread second = new Thread(syn.new readIncrementCount(syn), "Second");
Thread third = new Thread(syn.new readIncrementCount(syn), "Third");
first.start();
second.start();
third.start();
}
private class readIncrementCount implements Runnable
{
SynchronizationMistake syn;
readIncrementCount(SynchronizationMistake syn)
{
this.syn = syn;
}
@Override
public void run() {
System.out.println("I am "+Thread.currentThread().getName()+".Count is "+ syn.getCount());
System.out.println("I am "+Thread.currentThread().getName()+".Incrementing count now"+syn.incrementCount());
System.out.println("I am "+Thread.currentThread().getName()+". After Increment Count is "+ syn.getCount());
}
}
}
Output is :
I am First.Count is 0
I am First.Incrementing count now
I am First. After Increment Count is 1
I am Third.Count is 0
I am Second.Count is 0
I am Third.Incrementing count now
I am Second.Incrementing count now
I am Third. After Increment Count is 3
I am Second. After Increment Count is 3
輸出變化我每次運行這個程序的時間。我懷疑當第二/第三線程得到CPU爲什麼它沒有讀'count'爲1(由第一個線程更新)?換句話說,當第一個線程鎖定'syn'並將count更新爲1時,第二個/第三個線程如何設法進入'getCount'方法。