singleton 패턴 적용시에 메소드에 동기화를 하기는 싫고, 그렇다고 static field를 사용할 수 없을때 DCL(Double-checked locking)을 사용했었는데 이것도 문제가 있다고 합니다.

  http://www.ibm.com/developerworks/kr/library/j-dcl.html

public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {  //1
      if (instance == null)          //2
        instance = new Singleton();  //3
    }
  }
  return instance;
}

[3]에서 생성자 body가 실행되기 전에 not-null 상태로 될 수 있다고 합니다.
때문에 JDK 1.5 이상 부터는 instance 변수를 volatile 로 선언하여 unique instance 변수가 원자성을 유지하도록 하여 올바른 싱글턴 인스턴스의 초기화가 진행되도록 해야 합니다.

하지만 여전히 메소드 동기화 또는 static field 사용을 추천하네요.

# 참고링크
* Double-checked locking 과 Singleton 패턴
* 디자인 패턴으로 알아본 Double-checked lock(DCL)
* 다시보는 Singleton

 

ant를 이용해 파일 단위로 배포를 해야 할 경우, 수정되지 않은 파일까지 전부 전송하게 되면 원거리 네트웍에 운영 서버가 있는 경우 배포 시간일 길어질 수 있다. 때문에 수정된 파일만 신속하게 배포하는 방법을 찾아 보았다.

FileSet의 하위요소인 Selector 중에 modified를 사용했다.
modified selector는 파일의 값을 계산한 후 이 값을 cache파일에 저장하고, 이 값과 실제 파일의 값을 비교하여 값이 다른 부분만 선택한다.

실제 적용에서는 서버별로 캐시파일 구분하여 저장하게 하였다.

<scp username="@{dp.remote.user}"  password="@{dp.remote.password}" todir="@{dp.remote.user}${deploy.at}@{dp.host}:@{dp.remote.play.path}/${project.name}" 
keyfile="@{dp.remote.keyfile}" trust="true" verbose="true" >
<fileset dir=".">
<modified>
<param name="cache.cachefile" value="${deploy.cache.dir}/@{dp.host}.cachefile"/>
</modified>
<include name="app/**"/>
<include name="conf/**"/>
<include name="lib/**"/>
<include name="public/**"/>
<include name="play.sh" />
<exclude name="**/.svn" />
<exclude name="conf/dev/**" />
<exclude name="conf/staging/**" />
<exclude name="conf/live/**" />
</fileset>
</scp>





# 참고 링크
http://ant.apache.org/manual/Types/selectors.html#modified
http://stackoverflow.com/questions/2538177/getting-ant-to-scp-only-new-changed-files