title: Concurrent-safe singleton with initialization parameter in java
body: <p>I want to make a singleton class Phone, so that it can be initializable (with number) and also concurrent-safe. So, here is what I came with:</p>
  
  <pre><code>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;
          }
      }
  }
  </code></pre>
  
  <p>also I have a file phone.properties containing</p>
  
  <pre><code>phone=12345
  </code></pre>
  
  <p>Is it a good solution? Is it concurrent safe?</p>