어떤 떡밥을 물었어 뭐냐면 java의 volatile예약어에 대해서야. 

싱글턴 패턴을 보던 중 흥미로운걸 발견했어. 저걸로 레퍼런스에 걸어두더라고. 그리고 뭐 다른 코드는 미슷했어 . 그냥 객체생성 부분만 블락으로 동기화 거는거... 그정도 ...

그래서 궁금해서 여기저기 검색하고 후시기횽한테 물어봐서 대충 어떤건진 알았어.

자바에서 수행하는 최소의 단위가 아닌 경우에 대한 안정성을 보장한다는 얘기던데 ...

사실 int나 그런건 상관 없지만 long나 double는 2번의 단계를 거치기때메(int는 32bit long는 64bit단위기 때메)이점에 대해서 두개의 쓰레드가 동시에 접근했을때 문제를 해결한다고 하더라고 ..

즉, 두개의 쓰레드가 동시에 접근했어. [32bit][32bit] 두 공간은 하나의 long타입으로 구성되어 있는데 쓰레드a가 앞부분을 조작중.. 그때 쓰레드b가 뒷부분을 조작해버린거야.

이렇게 되면 쓰레드a와 b의 값이 아닌 엉뚱한 값이 들어가서 .. 꺠지게 되는데 .. 이걸 방지하기 위한거라고 하더라고 ..
(먼저 저게 맞는지 확인점..)

그래서 궁금한게 생겼어.
==

package ch05_Singleton;

public class Singleton3 {
    private volatile static Singleton3 single;
    public static Singleton3 getInstance(){
        if (single == null) {
            synchronized(Singleton3.class) {
                if (single == null) {
                    single = new Singleton3();
                }
            }
        }
        return single;
    }
    private Singleton3(){
    }
}

== 

위 코드처럼 싱글턴은 보통 객체생성부분을 동기화를 거는데 .. 

싱글턴이니 동기화블럭에 들어가서 객체를 생성하는 작업을 하고있어.

아직 레퍼런스가 null일때 \'어 ? null이네 .\'하면서 객체를 생성하려고 해도 동기화부분에서 이미 객체생성부분을 수행하고 나와야 들어갈 수 있는데 .. volatile 를 안써도 상관없지 않나 .. 싶어 ..

어차피 생성부분이 동기화가 걸렸다면... 맨 위에 말한대로(사실 저것도 저로인해 생기는 문제를 구경하기란 없다고 봐도 무방할듯 하고..)의 경우가 아니라 .. 위처럼 동기화걸고 객체생성부분이라면.. 불필요하지 않을까?