[英]Concurrent-safe singleton with initialization parameter in java
我想制作一个单例类的Phone,以便它可以初始化(带有数字)并且还可以并发安全。 因此,这是我附带的:
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
这是一个好的解决方案吗? 并发安全吗?
我相信Enum仍然是在Java中实现线程安全的单例的最佳方法。
我不鼓励您使用单例( 请检查其他问题 )
否则,您的代码是线程安全的,因为您所做的唯一影响是在static {}
区域中,根据定义,该区域是线程安全的。
顺便说一句,为什么不将您的readPhoneNumber()
方法直接合并到phone
类中?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.