java中带初始化参数的并发安全单例
我想做一个单例类手机,这样它就可以初始化(使用数字)并且并发安全。下面是我带来的:java中带初始化参数的并发安全单例,java,design-patterns,concurrency,Java,Design Patterns,Concurrency,我想做一个单例类手机,这样它就可以初始化(使用数字)并且并发安全。下面是我带来的: import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class PhoneTest { public static void main(String... args){ System.out.println(Ph
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class PhoneTest {
public static void main(String... args){
System.out.println(Phone.getInstance().getNumber());
}
static final class Phone {
private final String number;
private final static Phone instance;
static {
instance = new Phone(PhonePropertyReader.readPhoneNumber());
}
private Phone(String number) {
this.number = number;
}
public static Phone getInstance() {
if (instance == null) throw
new IllegalStateException("instance was not initialized");
return instance;
}
public String getNumber() {
return number;
}
}
static final class PhonePropertyReader {
static String readPhoneNumber() {
File file = new File("phone.properties");
String phone = "";
System.out.println(file.getAbsolutePath());
if (!file.exists()) {
return phone = "555-0-101";
}
try {
BufferedReader r = new BufferedReader(new FileReader(file));
phone = r.readLine().split("=")[1].trim();
r.close();
} catch (IOException e) {
}
return phone;
}
}
}
我还有一个文件phone.properties包含
phone=12345
这是一个好的解决方案吗?它是并发安全的吗?我不鼓励您使用单例() 否则,您的代码是线程安全的,因为您所做的唯一做作是在
静态{}
区域,根据定义,该区域是线程安全的
顺便说一句,为什么不将你的
readPhoneNumber()
方法直接合并到你的phone
类中?我不鼓励你使用单例()
否则,您的代码是线程安全的,因为您所做的唯一做作是在静态{}
区域,根据定义,该区域是线程安全的
顺便说一句,为什么不将您的
readPhoneNumber()
方法直接合并到您的phone
类中?我认为这仍然是在java中实现线程安全的单例的最好方法。我认为这仍然是在java中实现线程安全的单例的最好方法。看起来不错。你可能想让你的单身汉变得懒惰。所以应该是这样的:对吧?然后我认为PhoneHolder将在加载Phone的同时加载,从而使本例中的Phone加载与我的初始代码同时发生。我说得对吗?是的,你说得对。你的例子看起来不错。除了第50行的空catch
,我建议你扔一个。谢谢,但是懒惰呢?我的初始代码和我在评论中发布的代码具有相同的“懒散性”,这是对的吗?看起来不错。你可能想让你的单身汉变得懒惰。所以应该是这样的:对吧?然后我认为PhoneHolder将在加载Phone的同时加载,从而使本例中的Phone加载与我的初始代码同时发生。我说得对吗?是的,你说得对。你的例子看起来不错。除了第50行的空catch
,我建议你扔一个。谢谢,但是懒惰呢?我的初始代码和我在评论中发布的代码具有相同的“懒散性”,这是正确的吗?下面是enum:right的外观。是的,有关java教程中的更多信息,请阅读。下面是enum:right的外观。是的,有关java教程中的更多信息,请阅读。