김윤수님의 블로그에 Reentrant 와 Thread-safe 의 차이점에 대한 아주 좋은 내용이 있습니다.
아래는 블로그에 있는 Thread-safe와 Reentrant에 대한 정의내용입니다.
꼭, 블로그에 가셔서 읽어보시는걸 추천합니다. ^^
어떤 루틴 또는 프로그램이 Thread-safe하다라고 하면 여러 쓰레드에 의해 코드가 실행되더라도 실행 결과의 correctness가 보장되는 것을 뜻합니다.

이 에 비해 어떤 루틴 또는 프로그램이 Reentrant하다라고 하면 여러 쓰레드가 코드를 동시에 수행할 수 있고, 그런 경우에도 실행 결과의 correctness가 보장되는 것을 뜻합니다.

'Lectures' 카테고리의 다른 글

CI(Continuous Integration)  (0) 2010/07/05
CAP Theorem  (0) 2010/06/16
Reentrant 와 Thread-safe 의 차이  (0) 2010/04/29
uml - relationships image  (0) 2010/04/17
uml - aggregation  (0) 2010/04/17

Singleton Pattern

from Ooad 2010/04/29 16:34
아래 내용은 OKJSP에서 발췌를 하였습니다..
소스코드내에는 몇가지 싱글톤 구현방법이 나옵니다. 그 각각이 의미하는바는 다음과 같습니다.

1) EagerSingleton
static class EagerSingleton extends Singleton {
    static final EagerSingleton theInstance = new EagerSingleton();
    static EagerSingleton getInstance() {
        return theInstance;
    }
}
이 경우는 미리 싱글톤 인스턴스를 생성하는 방법으로 static final 필드에 인스턴스를 생성하여 할당하는 방법입니다. 이 필드는 클래스로더에 의해서 EagerSingleton이 메모리로 올라오는 순간에 안전하게(thread-safe하게)초기화 됩니다. 이 방법이 아마 성능이 가장 우수하게 나타날 것입니다.
장점은 동기화부담이 적다는 것입니다. 단 한번 클래스로더가 thread-safe하게 클래스를 로드하는 시점에 클래스가 로딩되어 안전합니다. 단점은 인스턴스가 미리부터 생성된다는 것입니다.

2) SynchedSingleton
static class SynchedSingleton extends Singleton {
    static SynchedSingleton theInstance;
    static synchronized SynchedSingleton getInstance() {
        if (theInstance == null)
            theInstance = new SynchedSingleton();
        return theInstance;
    }
}
이 방법은 싱글톤 필드에 접근할때마다 동기화를 수행하는 방법입니다. 매번 동기화를 수행하므로 자바 메모리 모델에 따른 각종 문제를 방지할 수 있어 thread-safe합니다. 단점은 매번동기화를 수행하므로 수행 비용이 높다는 것입니다.

3) ThreadLocalSingleton
static class ThreadLocalSingleton extends Singleton {
    static final ThreadLocal perThreadInstance = new ThreadLocal();
    static final Object lock = new Object();
    static ThreadLocalSingleton theInstance;
    static ThreadLocalSingleton getInstance() {
        ThreadLocalSingleton instance = (ThreadLocalSingleton)(perThreadInstance.get());
        if (instance == null) {
            synchronized(lock) {
                instance = theInstance;
                if (instance == null)
                    instance = theInstance = new ThreadLocalSingleton();
            } // copy global to per-thread
                perThreadInstance.set(instance);
        }
        return instance;
    }
}
이 방법은 Thread Local Storage를 사용한 해법입니다. 자바 쓰레드 메모리 모델에서 문제가 발생하는 것은 멀티 CPU상황에서 각각의 CPU가 자신의 캐시내에 클래스의 필드를 복사해넣는다는 것입니다. 이러한 캐시는 메인메모리와 동기화가 되어 있지 않습니다. 즉, 각각의 CPU가 하나의 클래스를 접근하게되면 각각의 CPU는 그 클래스의 내용을 다르게 볼 수 있다는 것입니다.
싱글톤을 구현하면 instance라는 필드를 여러개의 CPU가 참조하는데 이 필드를 여러개의 CPU가 다르게 보게 됩니다. 예를들어 CPU A가 인스턴스를 생성하고 생성한 인스턴스를 instance에 할당한다고 합시다.
그러면 CPU A가 또다시 이 instance 필드를 참조할때는 생성된 인스턴스를 제대로 보게 됩니다. 그러나 CPU B가 이 instance필드를 참조할때는 instance필드가 null로 나타날 수 있습니다. 그 이유는 CPU A가 수행한 작업은 synchronized블록을 통과할때까지 메인메모리에 반영이 안되고 자신의 캐시내에만 담겨 있을 수 있으며, CPU B역시 synchornized블록을 통과하지 않으면 메인메모리가 아닌 자신의 캐시만
들여다보기 때문입니다.

이를 해결하려면 각각 CPU가 동기화블록을 들어갔다가 나와야만 하는데, 이를 구현한 것이 위의 코드입니다. 각각의 Thread는 자신만의 메모리공간으로서 TLS(Thread Local Storage)를 가지고 있으며 이들은 매 쓰레드마다의 공간이므로 동기화될 필요가 없습니다. 따라서 이 저장소에 해당 쓰레드가 synchronized블록을 한번이라도 다녀왔는지(한번이라도 다녀오면 CPU가 메인메모리의 값을 가져오니까요)를
저장해둡니다.

4) SimulatedThreadLocalSingleton
static class SimulatedThreadLocalSingleton extends Singleton {
    static SimulatedThreadLocalSingleton theInstance;
    static final Object lock = new Object();
    static final Object key = new Object();
    static Singleton getInstance() {
        TSS t = (TSS)(Thread.currentThread());
        Singleton instance = (Singleton)(t.threadLocalHashtable.get(key));
        if (instance == null) {
            synchronized(lock) {
                instance = theInstance;
                if (instance == null)
                    instance = theInstance = new SimulatedThreadLocalSingleton();
            } // copy global to per-thread
            t.threadLocalHashtable.put(key, instance);
        }
        return instance;
    }
}
이 방법은 TLS를 ThreadLocal 클래스를 쓰지 않고 직접구현한 방식입니다.

5) VolatileSingleton
static class VolatileSingleton extends Singleton {
    static final Object lock = new Object();
    static volatile VolatileSingleton theInstance;
    static VolatileSingleton getInstance() {
        VolatileSingleton instance = theInstance;
        if (instance == null) {
            synchronized(lock) {
                instance = theInstance;
                if (instance == null)
                    instance = theInstance = new VolatileSingleton();
            }
        }
    return instance;
    }
}
주의!)이 방법은 절대로 사용해서는 안됩니다.

이 방법은 volatile를 사용합니다. volatile 로 선언된 필드는 매번 원자적으로 쓰레드 safe하게 이루어집니다. 즉 각각의 변수에 대한 접근이 매번 메인메모리와 동기화될 뿐만아니라, thread safe하게 이루어집니다. synchronized와 volatile은 이처럼 변수의 접근마다 동기화를 하느냐 아니면 특정 블록을 통채로 동기화 하는냐의 문제에 있어서 접근방법이 틀립니다. 그러나 아쉽게도 volatile은 대부분의 자바 컴파일러에서 제대로 구현되어있지않으며 따라서 사용하는것을 권하지 않습니다. SUN의 컴파일러는 제대로 되지 않느냐 하고 생각하실 수 있지만 전혀 안그렇습니다. SUN의 JDK 1.3대에서도 제대로 구현이 되어있지 않습니다.
volatile은 동기화의 문제를 비롯한 다양한 암시적 작동이 보장되어야하는데 이를 제대로 책임지고 않기때문입니다.

6) DirectThreadFieldSingleton
static class DirectThreadFieldSingleton extends Singleton {
    static DirectThreadFieldSingleton theInstance;
    static final Object lock = new Object();
    static Singleton getInstance(TSS t) {
        Singleton instance = t.singleton;
        if (instance == null) {
            synchronized(lock) {
                instance = theInstance;
                if (instance == null)
                instance = theInstance = new DirectThreadFieldSingleton();
            } // copy global to per-thread
            t.singleton = instance;
        }
        return instance;
    }
}
인스턴스를 할당받고자하는 쪽에서 TSS라는 형태의 클래스를 쓰레드마다 할당한채로 갖고 있다가 이것을 싱글톤 클래스에 넘깁니다. 그러면 TSS.singleton변수의 값을가지고 동기화 수행여부를 결정하는 방식입니다. ThreadLocal의 변형이며, 모든 인스턴스를 획득하고자하는 쓰레드가 TSS를 넘겨야한다는 점에서
좋은 방법은 아니겠죠.

7) ThreadFieldSingleton
static class ThreadFieldSingleton extends Singleton {
    static final Object lock = new Object();
    static ThreadFieldSingleton theInstance;
    static Singleton getInstance() {
        TSS t = (TSS)(Thread.currentThread());
        Singleton instance = t.singleton;
        if (instance == null) {
            synchronized(lock) {
                instance = theInstance;
                if (instance == null)
                    instance = theInstance = new ThreadFieldSingleton();
            } // copy global to per-thread
            t.singleton = instance;
        }
        return instance;
    }
}
이 방법역시 ThreadLocal의 구현에 대한 변형된 구현입니다. ThreadLocal 대신, 특정 싱글톤 클래스에 대한 인스턴스를 획득하려고 시도하는 쓰레드를 캐스팅해서 ThreadLocal을 구현한 것이죠. 개인적으로 이 방법은 별로 좋지 않다고봅니다. 특정 클래스의 인스턴스를 획득하려면 쓰레드가 어떠한 인스턴스를 구현하고 있는지는 쉽사리 가정하기가 곤란하죠.


'Ooad' 카테고리의 다른 글

OOP 설계 5원칙  (2) 2010/07/19
Singleton Pattern  (0) 2010/04/29
Null Object Pattern  (2) 2009/09/17
Specification Pattern  (2) 2009/09/16
디자인 패턴 그리고 그 이후..  (0) 2009/09/16

garbage collector

from Java 2010/04/29 13:51
자바의 Garbage Collector 이슈는 성능과 더불어 자원 해제라는 막중한 역할을 하기 때문에 중요하게 파악을 해 둬야 되는 내용입니다. 아래는 자바에서 지원하고 있는 Garbage Collector의 영역별 내용과 형태에 대한 내용입니다.

 - serial collector : young, old 영역, java 1.4 버전까지 default collector, single cpu만 사용
 - parallel collector : young 영역, java 5 버전부터 CPU 2, MEM 2G 이상(Hot Spot VM)일 경우 자동선택
 - parallel compacting collector : old 영역, option으로 지정해야 선택됨
 - cms(concurrent mark-sweep) collector : old 영역, option으로 지정해야 선택됨.
 -
G1 collector : young, old 영역,  1.6.0_14(NUMA 구조 지원, 1.6.0_18 버전에 성능에 대한 언급) 부터 사용이 가능합니다. option으로 지정해야 선택됨. “early access software”, 자바 비즈니스 라이선스를 구매하지 않은 고객은 사용을 하지 않는 것이 좋다고 합니다. Java 7버전을 타켓으로 하고 있다고 합니다.

java c/c++, c# 호출방식

from Tools 2010/04/29 13:36
c/c++ 호출
기본적으로 JNI를 이용해서 호출합니다.
JNI
를 쉽게 사용하기 위한 Wrapper들이 여러 개 존재하고 있습니다.
 -
HawtJNI(http://hawtjni.fusesource.org/documentation/index.html )
 -
JNIWrapper(http://www.teamdev.com/jniwrapper/)
 - 
JNIEasy(http://www.innowhere.com/webapp/index.jsp#st=products.jnieasy )

c# 호출
j-interop (Pure Java – Com Bridge) : http://j-interop.org/ , 라이센스 : LGPL 3.0[1]

java <-> c#
 - Jni4net : http://jni4net.sourceforge.net/ , bridge between Java and .NET (interprocess, fast, object oriented, open-source), 라이선스: opensource, GPL tools and LGPL runtime

using net.sf.jni4net;

public class Program
{
    private static void Main()
    {
        Bridge.CreateJVM(new BridgeSetup());
        java.lang.System.@out.println("Greetings from C# to Java world!");
    }
}


import net.sf.jni4net.Bridge;
import java.io.IOException;
import java.lang.String;

public class Program {
    public static void main(String[] args) throws IOException {
        Bridge.init();
        system.Console.WriteLine("Greetings from Java to .NET world!");
    }
}

 - ikvm.net : http://www.ikvm.net/, jar -> .dll, .dll -> .jar



'Tools' 카테고리의 다른 글

무료 CAPTCHA 서비스  (0) 2010/06/16
json simple library  (0) 2010/05/18
java c/c++, c# 호출방식  (0) 2010/04/29
eclipse에서 java source 보기  (0) 2010/03/16
build.xml refactoring using macrodef tag  (1) 2010/03/15
자세한 내용은 https://www.ibm.com/developerworks/kr/library/dwclm/20100427/index.html를 참고하시면 됩니다.  내용에서 소프트웨어 관리자의 관리개선 효과가 프로젝트에 미치는 영향이 최고입니다. 하지만, 프로젝트 관리자는 주로 효과가 미약한 툴 개선을 주로 해 볼려고 한다는 것이죠..
참 공감이 가는 얘기입니다.. 개인적으로는 절대절대, 개발을 잘 해온 사람이 제 위의 관리자가 되었으면 합니다.



  • 도구: 2.97배
  • 사람: 10.55배
  • 시스템: 25.76배
  • 관리: 64.00배

마지막의 소프트웨어 개발 관리자는 어떤 소스 컨트롤 툴을 사용할지 고심하는 것 외에도 노력해야 할, 중요한 것들이 있다. 그것은 자신을 돌아보고 관리 방식 자체에 문제가 없는지 살펴보고 개선하는 것이다. 관리하시는 분들, 툴이 어쩌구 저쩌구가 아니라 관리 좀 잘해주소..

uml - relationships image

from Lectures 2010/04/17 00:08
좋은 이미지가 있어서 업로드 합니다.
이미지 출처는 http://www.digipine.com/187 입니다.
 


'Lectures' 카테고리의 다른 글

CAP Theorem  (0) 2010/06/16
Reentrant 와 Thread-safe 의 차이  (0) 2010/04/29
uml - relationships image  (0) 2010/04/17
uml - aggregation  (0) 2010/04/17
uml - composition  (0) 2010/04/17
Tag // relationships, UML

uml - aggregation

from Lectures 2010/04/17 00:05
aggregation은 association의 하위 분류로, 집합적인 관계를 표시합니다. 연관관계를 가지는 클래스 객체와 라이프 사이클이 동일하지 않을 경우, aggregation 관계입니다.

1. class diagram


2. code
2.1 I.java
public class I {
    private ArrayList<J> array;
    public I() {
    }
    public void setArray(ArrayList<J> array) {
        this.array = array;
    }
}

2.2 J.java
public class J {
    private J j;
}


'Lectures' 카테고리의 다른 글

Reentrant 와 Thread-safe 의 차이  (0) 2010/04/29
uml - relationships image  (0) 2010/04/17
uml - aggregation  (0) 2010/04/17
uml - composition  (0) 2010/04/17
uml - denpendency  (0) 2010/04/11
Tag // Aggregation, UML

uml - composition

from Lectures 2010/04/17 00:00
composition은 association의 하위 분류로, 집합적인 관계를 표시합니다. 연관관계를 가지는 클래스 객체와 라이프 사이클이 동일한 경우, composition 관계입니다.

1. class diagram


2. code
2.1 G.java
public class G {
    private ArrayList<H> array;
    public G() {
        array = new ArrayList<H>();
    }
}

2.2 H.java
public class H {
    private G g;
}

'Lectures' 카테고리의 다른 글

uml - relationships image  (0) 2010/04/17
uml - aggregation  (0) 2010/04/17
uml - composition  (0) 2010/04/17
uml - denpendency  (0) 2010/04/11
uml - association  (0) 2010/04/11
Tag // Composition, UML

uml - denpendency

from Lectures 2010/04/11 01:09
dependency는 의존적인 관계를 나타냅니다.

1. class diagram


2. code
2.1 E.java
public class E {
    public void handle(F f) {
    }
}

2.2 F.java
public class F {
}

'Lectures' 카테고리의 다른 글

uml - aggregation  (0) 2010/04/17
uml - composition  (0) 2010/04/17
uml - denpendency  (0) 2010/04/11
uml - association  (0) 2010/04/11
delegation in java  (0) 2010/04/06
Tag // Dependency, UML2.0

uml - association

from Lectures 2010/04/11 00:59
association은 단순하게 관계가 있다는 말이죵.. 관계에는 단방향과 양방향이 있겠죵.. ^^
그리고, association은 집합적인 개념으로 aggregation과 composition을 포함하고 있습니다..

1. 양방향
 - 아래의 그림처럼 실선으로 표현합니다.


 - 위 Diagram을 통해서 도출된 코드는 아래와 같습니다.. ^^
A.java
public class A {
    /** */
    public B Unnamed1;
}

B.java
public class B {
    /** */
    public A Unnamed1;
}


2. 단방향
 - 아래의 그림처럼 화살표와 실선으로 표현합니다.


 - 위 Diagram을 통해서 도출된 코드는 아래와 같습니다.. ^^
C.java
public class C {
    /** */
    public D Unnamed1;
}

D.java
public class D {
}


'Lectures' 카테고리의 다른 글

uml - composition  (0) 2010/04/17
uml - denpendency  (0) 2010/04/11
uml - association  (0) 2010/04/11
delegation in java  (0) 2010/04/06
Framework vs Toolkit  (1) 2010/03/25
Tag // Association, UML

delegation in java

from Lectures 2010/04/06 21:57
delegation(위임)에 대한 정의는 아래와 같다.
 Delegation means that you use an object of another class as an instance variable, and forward messages to the instance.

아래 예제는 위키의 Delegation Pattern 페이지에 나와있는 Java 예제입니다.

 class RealPrinter { // the "delegate"
     void print() {
       System.out.print("something");
     }
}

class Printer { // the "delegator"
     RealPrinter p = new RealPrinter(); // create the delegate
     void print() {
       p.print(); // delegation
     }
}

public class Main {
     // to the outside world it looks like Printer actually prints.
     public static void main(String[] args) {
         Printer printer = new Printer();
         printer.print();
     }
}

누군가 말씀하신, 이벤트 소스/이벤트 핸들러/이벤트 리스너 어쩌주 저쩌구 거창한 얘기가 필요없다.. 
쉽게쉽게 가장.. ^^

 

'Lectures' 카테고리의 다른 글

uml - denpendency  (0) 2010/04/11
uml - association  (0) 2010/04/11
delegation in java  (0) 2010/04/06
Framework vs Toolkit  (1) 2010/03/25
Platform vs. Framework  (1) 2010/03/24