2016-02-11 16 views
3

由於意外的屬性值,我得到錯誤,我試圖縮小原因。該屬性通過以下示例類從文件加載:是我的PropertyLoader單例線程安全嗎?

public final class PropertyLoader { 

    private enum Instances{ 
     ELVIS; 

     private final PropertyLoader loader; 

     Instances() { 
      this.loader = new PropertyLoader(); 
     } 
    } 

    private boolean isPropertyEnabled; 

    private PropertyLoader() { 
     loadProperties(); 
    } 


    public static PropertyLoader getInstance() { 
     Instances.ELVIS.loader; 
    } 

    private void loadProperties() { 
     this.isPropertyEnabled = loadPropertyFromFile(FILE, "enabled"); 
     //... more properties 
    } 

    public boolean isPropertyEnabled() { 
     // eventually returns unexpected value 
     return this.isPropertyEnabled; 
    } 
} 

該實現是線程安全嗎?如果不是,我如何在不改變接口的情況下改進實現?有沒有一種有效的策略來測試這個類的併發性問題?

回答

2

它是線程安全的。因爲所有的初始化基本上都是在類的初始化過程中完成的。因此,在類加載完成之前,兩個線程無法從對象中獲取數據。