2010-08-09 2 views
4

나는 임의의 자바 코드를 통해이 코드 조각을 보았습니다. 흐름을 이해하고 클래스의 실제 구현 방법을 이해하는 데 어려움을 겪고 있습니다. 그래서 내 기본 질문은 WhatDoIDo 클래스는 실제로합니까? 어떤 지침도 감사 할 것입니다.Java : 지시 흐름이 분명하지 않습니다.

Q : 때문에 동시 실행 환경에서의 향상된 성능을 설명하는 단위 테스트 케이스 하겠는가 .

코드

public class WhatDoIDo{ 
    private X x; 
    private boolean b; 
    private Object o; 

    public WhatDoIDo(X x) { 
     this.x = x; 
    } 

    synchronized Object z() { 
     if (!b) { 
      o = x.y(); 
      b = true; 
     } 
     return o; 
    } 

    public interface X { 
     Object y(); 
    } 
} 
+0

동시성 패키지를 사용하여 어떻게 성능을 향상시킬 수 있습니까? 또는 다른 방법으로 동기화 된 상태로하지 않고 동시 액세스를위한 메소드를 어떻게 열 수 있습니까? – Rachel

답변

2

WhatDoIDo 객체 o를 래핑 래퍼 클래스입니다 :

+0

성능 향상을 확인하기위한 테스트 사례를 어떻게 구현할 수 있습니까? – Rachel

0
synchronized Object z() { 
    if (!b) { 
     o = x.y(); 
     b = true; 
    } 
    return o; 
} 

기본 가시성 (패키지 표시)가있는 방법이다. Object 유형의 객체 을 반환합니다. 서명에는 키워드가 동기화되어 있습니다. 이렇게하면 컴파일러가 여러 스레드가 동시에이 메서드를 실행할 수 없도록합니다. 한 스레드가 메서드를 실행하면 메서드는 , 또는 으로 동기화됩니다. 다른 스레드는 원래 스레드가이 암시 적 잠금을 해제 할 때까지 메소드를 실행할 수 없습니다.

요약하면 synchronized 키워드는 semaphore 메커니즘이 Java에 내장되어 있습니다. (사실, 두 번째 생각에서이 키워드는 실제로 세마포어입니까?)

+0

지침의 흐름을 자세히 설명 할 수 있습니까 ? – Rachel

+0

부울 필드 "b"가 false 인 경우 "o"개체에 메서드 "y"의 결과가 할당되고 "x"개체에 바인딩됩니다. 그런 다음 "b"에 "true"값이 지정되고 "o"가 반환됩니다. – Mike

+0

내부 흐름에 대해 마이크에게 감사하지만 클래스의 전체 흐름을 이해하려고 시도하고 있으며이 클래스가 실제로 수행하고있는 작업은 무엇입니까? – Rachel

0

마이크가 말하는 것 외에.
부울 값의 기본 초기화는 false입니다 (정수, 부동 소수점 및 복식 0 - 객체는 null로 설정 됨).
메소드가하는 것은 처음으로 생성자에 전달 된 X에있는 객체 Y가 무엇이든 반환합니다. 그런 다음 o가 x.y()에 할당 되었기 때문에 동일한 결과를 반환합니다.

이 숙제가 있습니까?

+0

아니요. 일부 Java 코드 질문에서 찾았지만 해결하고 싶지만 문제 해결에 어려움을 겪고있었습니다. – Rachel

+0

@Rachel을 운동으로 사용하면 코드가 s * & ks –

+0

으로 유효하며 그 이유는 무엇입니까? 나는이 훈련에서 얻을 수있는만큼 많은 것을 얻으 려하고있다. 또한이 접근법을 최적화하기 위해 동시성 패키지를 사용할 수있는 방법이 있는가? – Rachel

0

WhatDoIDo 클래스는 인터페이스 X를 구현하는 클래스를 감싸는 래퍼와 비슷합니다. 처음 z를 호출하면 반환 할 객체를 설정하고 b를 true로 설정하므로 xy ()는 null을 반환하고 xy()는 다시 호출되지 않습니다.

그런 식으로 반복해서 z()를 호출하면 같은 객체 (또는 null 값)가 반환됩니다.

http://en.wikipedia.org/wiki/Memoization

+0

이와 같은 것을 갖을만한 이유가 있습니까? – Rachel

+0

동시성 패키지를 사용하여 성능을 최적화 할 수있는 방법이 있습니까? – Rachel

+0

비싸다면 x.y()를 반복해서 호출 할 필요가 없도록 최적화하는 것이 좋습니다. –

3

간단 메모이 제이션 것 같다.

내부 interface X을 정의하고 y()이라는 메서드를 사용하여 Object을 만듭니다. 이 인터페이스는 객체를 생성하기위한 전략으로 생각할 수 있습니다. WhatDoIDo의 오브젝트가 new을 사용하여 작성되면, 오브젝트 생성에 사용되는 X 오브젝트가 생성자에 제공됩니다.

래핑 된 개체를 만들고 z() 메서드를 통해 클라이언트 코드에서 사용할 수있게합니다. 객체를 느리게 생성합니다. boolean 플래그 b을 사용하여 오브젝트가 작성되었는지 여부를 추적합니다. 랩핑 된 오브젝트를 확보하기 위해 클라이언트가 z()을 호출하면 플래그가 설정된 경우 o 오브젝트가 리턴됩니다. flag가 설정되지 않은 경우이 WhatDoIDo 개체를 만들 때 제공되는 전략 X을 사용하여 개체가 만들어집니다. 생성 된 객체에 대한 참조가 저장되고 클라이언트에 반환됩니다. 또한 z()은 이미 작성되지 않은 경우 오브젝트를 작성하므로 synchronized입니다. 동기화되지 않은 경우 두 개의 스레드가 각각 하나의 객체를 생성하게되고 그 중 하나만 저장됩니다.

public class ObjectWrapper { 
    private CreationStrategy strategy; 
    private boolean objectCreated; 
    private Object wrappedObject; 

    public ObjectWrapper(CreationStrategy strategy) { 
     this.strategy = strategy; 
    } 

    synchronized Object getWrappedObject() { 
     if (!objectCreated) { 
      wrappedObject = strategy.createObject(); 
      objectCreated = true; 
     } 
     return wrappedObject; 
    } 

    public interface CreationStrategy { 
     Object createObject(); 
    } 
} 
+0

정적 메커니즘 또는 지연로드와 관련 될 수도 있습니까? – Rachel

관련 문제