synchronizedの役割(四)


注意:
1、synchronizedでオブジェクトをロックする場合、そのオブジェクトがロックコードセグメントで変更されると、このロックは消えます.次の例を参照してください.
ターゲットクラス:
public class TestThread {
     private static final class TestThreadHolder {
            private static TestThread theSingleton = new TestThread();
            public static TestThread getSingleton() {
                return theSingleton;
              }
            private TestThreadHolder() {
              }
          }
     
    private Vector ve =null;
    private Object lock=new Object();
    private TestThread(){
          ve=new Vector();
          initialize();
      }
    public static TestThread getInstance(){
        return TestThreadHolder.getSingleton();
      }
    private void initialize(){
        for(int i=0;i<100;i++){
              ve.add(String.valueOf(i));
          }
      }
    public void reload(){
        synchronized(lock){
              ve=null;            
              ve=new Vector();
                        //lock="abc"; 
            for(int i=0;i<100;i++){
                  ve.add(String.valueOf(i));
              }
          }
          System.out.println("reload end");
      }
    
    public boolean checkValid(String str){
        synchronized(lock){
              System.out.println(ve.size());
            return ve.contains(str);
          }
      }
}
説明:reloadメソッドとcheckValidメソッドの両方にsynchronizedキーワードを追加し、lockオブジェクトをロックします.同じオブジェクトインスタンスのreloadメソッドとcheckValidメソッドは、異なるスレッドでそれぞれ呼び出されます.
reloadメソッドでは、lockオブジェクト、すなわち注釈lock=「abc」は変更されません.その結果、reload endがコンソールから出力されてから100が出力されます.説明は同期呼び出しです.
reloadメソッドでlockオブジェクトを変更するとコメントが削除され、最初に数値(現在のveのサイズ)が出力され、reload endが出力されます.説明は非同期呼び出しです.
2、単例モードにおけるマルチスレッドの考慮