Hinweis Wechsel: Obwohl unter scenariois nicht gültig sind, welches Konzept der synchronisierten Block verletzt, noch zu wissen, habe ich versucht, wie es, wenn soZwei Fäden in synchronisierten Block von Monitor in der Laufzeit
zwei Threads Erstellt arbeitet, Beide Threads versuchen denselben kritischen Abschnitt auszuführen. Überraschenderweise treten beide Threads in den kritischen Abschnitt ein, obwohl sie den Monitor wechseln.
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);
}
}
}
Im Folgenden finden Sie Ausgabe:
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
scheint beide Threads tritt auch wenn Monitor geändert wird.
Jede Hilfe ist willkommen ..
Monitor nur Blöcke wenn es genau dasselbe Objekt zwischen Threads ist, haben Sie zwei Threads und zwei Monitore, es gibt nichts, das sich gegenseitig blockiert –
Worüber sind Sie überrascht? Wie denken Sie, dass Monitore funktionieren? – shmosel
Meine schlechte .. einige Tippfehler in Code .. änderte es .. jetzt zwei Threads .. ein Monitor .. immer noch beide Threads tritt in kritischen Abschnitt – LoneWolf