अनुकूलित एनम परिभाषा थ्रेड सुरक्षित नहीं हो सकती है। उदाहरण के लिए,
RoleEnum.java:
package com.threadsafe.bad;
public enum RoleEnum {
ADMIN(1),
DEV(2),
HEAD(3);
private Integer value;
private RoleEnum(Integer role){
this.value=role;
}
public static RoleEnum fromIntegerValue(Integer role){
for(RoleEnum x : values()){
if(x.value == role){
return x;
}
}
return RoleEnum.HEAD;
}
Class<?> buildFromClass;
public void setBuildFromClass(Class<?> classType){
buildFromClass=classType;
}
public Class<?> getBuildFromClass(){
return this.buildFromClass;
}
}
Main.java:
package com.threadsafe.bad;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread threadA = new Thread(){
public void run(){
System.out.println("A started");
RoleEnum role;
role=RoleEnum.fromIntegerValue(1);
System.out.println("A called fromIntegerValue");
role.setBuildFromClass(String.class);
System.out.println("A called setBuildFromClass and start to sleep");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread A: "+role.getBuildFromClass());
}
};
Thread threadB = new Thread(){
public void run(){
System.out.println("B started");
RoleEnum role;
role=RoleEnum.fromIntegerValue(1);
role.setBuildFromClass(Integer.class);
System.out.println("B called fromIntegerValue&setBuildFromClass and Start to sleep");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("B waked up!");
System.out.println("Thread B: "+ role.getBuildFromClass());
}
};
threadA.start();
threadB.start();
}
}
कभी कभी उत्पादन होगा:
बी
शुरू कर दिया
बी fromIntegerValue बुलाया & सेट BuildFromClass और प्रारंभ
एक
शुरू कर दिया सो
एक fromIntegerValue
नामक एक setBuildFromClass कहा जाता है और सोने के लिए
थ्रेड एक शुरू: वर्ग java.lang.String
बी ऊपर waked!
थ्रेड बी: कक्षा java.lang.String <-हम java.lang की अपेक्षा करते हैं।पूर्णांक
कभी कभी उत्पादन होगा:
एक शुरू कर दिया
एक fromIntegerValue
एक setBuildFromClass कहा जाता है और सोने के लिए
बी
बी शुरू कर दिया बुलाया शुरू बुलाया IntegerValueसेsetBuildFromClass और सोने के लिए प्रारंभ
थ्रेड एक: कक्षा java.lang.Integer < -हम उम्मीद java.lang.String
बी ऊपर waked!
थ्रेड बी: कक्षा java.lang.Integer
स्रोत
2014-10-17 11:02:36
"थ्रेड-सुरक्षित" से आपका क्या मतलब है? 'LeaveThebuilding' विधि सिंक्रनाइज़ नहीं है, इसलिए निश्चित रूप से इसे कई धागे द्वारा एक साथ चलाया जा सकता है। या आप 'इंस्टेंस' शुरू करने के बारे में बात कर रहे हैं? –
जब आप "सिंगलटन" कहते हैं, तो क्या आपका मतलब है कि इसमें परिवर्तनीय स्थिति है? उस स्थिति में आप वैसे भी हार गए हैं। –
बस मेरा $ 0.02, लेकिन मुझे लगता है कि सिंगलटन पैटर्न को लागू करने के लिए एक enum का उपयोग कोड obfuscation है। उस ने कहा, मुझे पता है कि ब्लोच कई अन्य लोगों के साथ सुझाव देते हैं और मेरी टिप्पणी डायनासोर की भौंकना हो सकती है। –