2016-08-06 4 views
1

오늘 클래스의 새 인스턴스를 가져 오기 위해 팩토리를 작성하라는 요청을 받았습니다. 나는 이것을 아주 쉽게했다.자바에서 클래스의 새 인스턴스를 반환하는 팩토리 메소드를 동기화해야합니까?

내 모든 동료 중 한 명이 내 코드를보고이 작업을 수행하는 방법을 동기화하라고했습니다.

나는 왜 그에게 물었고, 그는 그것이 옳은 것이라고 대답했다. (질문이있을 때 아무런 설명도하지 않았다.) 나는 내가 객체의 상태를 조작하지 않기 때문에 믿을 때 그것을하지 않았다. 나는 그것을 동기화 할 필요가 없다.

나는 그저 내가 옳았는지 분명히하고 싶다. 내가 틀렸다면 누군가가 왜 동기화가 필요한지 설명 할 수 있습니까? 의견에 따라

예를 들어

private static Map<String, IProduct> products = new HashMap<String, IProduct>(); 

public IProduct getInstance(code){ 
    return products.get(code).create(); 
} 

편집 : 나는 지금에 액세스 할 수 없습니다로

  • 나는 전체 코드를 줄 수 없습니다. 내가 일하러 돌아올 때 나는 그것을 할 것이다.
  • 제품은 Map<String, IProduct>
  • create()IProduct를 구현하는 클래스의 메소드입니다. 이 메서드는 구현 클래스의 새 인스턴스를 반환합니다.
  • 정적지도에 넣는 인스턴스는 Product의 인스턴스를 '새로 만들기'위해서만 사용됩니다. 우리는 팩토리 메소드를 동기화 할 경우 하나 개의 스레드가 새로운 인스턴스를 검색하는 동안
+5

'products' 란 무엇이며'???. create()'메서드는 무엇입니까? – qxz

+3

정말로 상태를 돌연변이시키지 않는다면 이것은 필요하지 않을 것이지만 실제 코드를 보여주기 전까지는 알 수 없습니다. 그런데 당신의 두뇌를 사용하지 않고 "모두 아는"동료의 말을 듣지 않는 것을 축하합니다. 엔지니어는 분별있는 주장으로 모든 진술을 뒷받침 할 수 있어야합니다. – Dici

+0

전체 수업을 게시 할 수 있습니까? 동기화가 필요한지 판단하는 것이 더 쉬울 것입니다. – pablochan

답변

-3

, 우리가 확인 것이라고 same.Instead 어떤 병렬 스레드를하지 않는 다른 스레드는 차례를 기다려야하고, 이미 생성 된 인스턴스를 얻을 것입니다.

+3

이것은 ** 필요한지 묻는 질문에 대답하지 않습니다 **. 그리고 코드가 없기 때문에 우리는 anwer를 할 수 없습니다. – Dici

+0

코드로 정확히 무엇을 달성하고 싶은지 확실하지 않았기 때문에, 동기를 잡으면 달성 할 수있는 것을 올리고 싶었습니다. –

1

나는 이 Map이고 그 구현이나 Collections.syncronizedMap()을 통해 동기화되지 않는다고 추측 할 것입니다. products에 저장된 내용이 변경 가능하면 get()을 사용하는 동안 다른 항목이 products으로 작동 할 가능성이 있으며 이로 인해 문제가 발생할 수 있습니다.

클래스가이 create() 방법은 가변 인 갖는다 어떤 경우 특히

, 다음 병렬 환경에서, 다른 스레드는 get()create() 전에 products로부터 검색된 값을 변이 수있는 원인 문제 (예를 들어 , create()이 설정된 횟수만큼만 호출 될 수있는 경우).

그렇다면 동료를 눌러서이 방법을 동기화해야하는 이유를 설명해야합니다. 그들은 특별한 이유가 있어야하며, 설명 할 수 없다면 그 이유가 충분하지 않거나 충분히 이해하지 못합니다.

관련 문제