Hallo,
Ich beschäftige mich gerade mit dem Entwurfsmuster Singleton und verstehe die Gefahr des MultiThreadings noch nicht völlig.
Folgender Code sollte doch dazu führen, das 2 Objekte des Singleton erzeugt werden ?
Viele Grüße,
hellcoder
Ich beschäftige mich gerade mit dem Entwurfsmuster Singleton und verstehe die Gefahr des MultiThreadings noch nicht völlig.
Folgender Code sollte doch dazu führen, das 2 Objekte des Singleton erzeugt werden ?
Code:
public class testMultiThreadingMain {
public static void main(String[] args) {
testMultiThreadingThread a = new testMultiThreadingThread("Thread A");
testMultiThreadingThread b = new testMultiThreadingThread("Thread B");
a.run();
b.run();
if (a.getInstanceSingelton().equals(b.getInstanceSingelton()))
System.out.println("Objekte sind identisch");
else
System.out.println("Objekte unterschiedlich !!!");
ProblemMultiThreading Singelton = ProblemMultiThreading.getInstance();
System.out.println(Singelton.getEntry("Thread B"));
System.out.println(Singelton.getSize()); //Sollte 1 sein und nicht 2 ?
}
}
Code:
public class testMultiThreadingThread extends Thread{
private String ThreadName;
private ProblemMultiThreading a;
public testMultiThreadingThread(String name) {
this.ThreadName = name;
}
public void run() {
a = ProblemMultiThreading.getInstance(); //erzeugen einmalige Instanz
a.setEntry(ThreadName,ThreadName);
}
public ProblemMultiThreading getInstanceSingelton(){
return a;
}
}
Code:
public class ProblemMultiThreading {
private static ProblemMultiThreading myCache = null;
private Hashtable<String,String> cache;
private ProblemMultiThreading() {
cache=new Hashtable<String,String>();
}
public static ProblemMultiThreading getInstance() //
{
if ( myCache == null ) {
try {
Thread.sleep(1000); //Hier sollte der Fehler entstehen
} catch (Exception e) {
e.printStackTrace();
}
myCache = new ProblemMultiThreading();
System.out.println("hier passiert der Fehler !!");
}
return myCache;
}
public void setEntry(String key, String value) {
cache.put(key, value);
}
public String getEntry(String key) {
return cache.get(key);
}
public int getSize() {
return cache.size();
}
}
Viele Grüße,
hellcoder