繁体   English   中英

Java中带有初始化参数的并发安全单例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM