[英]synchronized keyword and locks on instance methods
我正在研究並發性,我正在學習阻塞線程。
我知道當相應的附加任務試圖訪問因另一個線程獲得鎖而被鎖定的方法時,線程可以進入阻塞狀態。
所以從我讀過的任務塊開始,等到它可以訪問該方法,然后繼續其業務(即run()方法的其余部分)。
那么為什么這個代碼退出就像任務可以調用syn.getI()並以“錯誤”狀態訪問變量(即使syn.manipulate()方法被鎖定所以我假設任務無法調用getI ())? 我在哪里錯了?
public class SynchronizedClass {
private int i;
private boolean flag=true;
public SynchronizedClass(int i){
this.i=i;
}
public int getI(){
return i;
}
public boolean getFlag(){
return flag;
}
public synchronized void manipulate(){
i=(i*2)+1; //odd number
Thread.yield();
i= i+1; //even number
}
public void close(){
flag=false;
}
}
public class MyThread implements Runnable {
//auto-managed runnable
Thread t;
SynchronizedClass syn;
public MyThread(SynchronizedClass syn){
this.syn=syn;
t=new Thread(this);
t.start();
}
@Override
public void run() {
while(syn.getFlag()==true){
syn.manipulate();
if (syn.getI()%2!=0){
syn.close();
System.out.println("exit");
}
}
}
public static void main(String[] args) {
SynchronizedClass syn = new SynchronizedClass(1);
for(int i=0;i<4;++i)
new MyThread(syn);
}
}
即使
syn.manipulate()
方法被鎖定,所以我假設任務無法調用getI()
我相信這是你犯的錯誤。
僅僅因為一個方法是同步的並不隱含意味着其他任何方法都是同步的。 它不像擁有與對象關聯的監視器的一個線程阻止其他線程訪問該對象 - 它只是阻止其他線程獲取監視器。
如果使getI()
方法同步, 則由於manipulate()
而擁有監視器的一個線程意味着在同一對象上調用getI()
其他線程必須等待,以便獲取監視器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.