注:以下scenarioisが有効でないにもかかわらず同期ブロックの概念に違反し、まだ私はそう2つのスレッド
は二つのスレッドを作成した場合、それがどのように動作するかを知ってみました、両方のスレッドが同じクリティカルセクションを実行しようとすると、驚くことに両方のスレッドがモニタを変更してもクリティカルセクションに入ります。
Thread Entered Critica section is:1 and name is:T1
Thread Entered Critica section is:1 and name is:T2
Thread Exiting Critical section is:1 and name is:T1
Thread Exiting Critical section is:1 and name is:T2
は、両方のスレッドがモニターを変更しても入るようだ:以下
public class MultiThreadTest {
final static ConcurrentHashMap<String,Object> objMap = new ConcurrentHashMap<String, Object>();
public static void main(String[] args) {
Thread t1 = new Thread(new MyThread(objMap,"1","T1"));
Thread t2 = new Thread(new MyThread(objMap,"1","T2"));
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(MultiThreadTest.class.getName()).log(Level.SEVERE, null, ex);
}
t2.start();
}
}
class MyThread implements Runnable{
private final ConcurrentHashMap<String,Object> objMap;
private final String id;
private final String name;
public MyThread(ConcurrentHashMap<String,Object> objMap, String id, String name){
this.objMap = objMap;
this.id =id;
this.name = name;
}
@Override
public void run() {
Object monitor = getMonitor(id);
synchronized(monitor){
System.out.println("Thread Entered Critica section is:"+id+" and name is:"+name);
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {
Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Thread Exiting Critical section is:"+id+" and name is:"+name);
}
}
private Object getMonitor(String id){
if(objMap.contains(id)){
return objMap.get(id);
}else{
objMap.put(id,new Object());
return objMap.get(id);
}
}
}
が出力されます。
どれヘルプは高く評価され..
ブロックのみを監視スレッド間にまったく同じオブジェクトがあれば、2つのスレッドと2つのモニタがあり、互いにブロッキングするものはありません –
あなたは何について驚いていますか?モニターはどのように機能すると思いますか? – shmosel
私の悪い..コードのいくつかのタイプミス..変更されました..現在2つのスレッド.. 1つのモニター..まだ両方のスレッドがクリティカルセクションに入る – LoneWolf