Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中带初始化参数的并发安全单例_Java_Design Patterns_Concurrency - Fatal编程技术网

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教程中的更多信息,请阅读。