2014-10-22 2 views

답변

1

동기화는 개체를 잠그지 않습니다! 그것은 코드의 중요한 부분을 표시합니다.

방법 (synchronized void foo())에 사용하는 경우 하나의 스레드 만이 방법에 액세스 할 수 있습니다.

개체 (synchronized(bar))와 함께 사용하는 경우이 개체에 대한 잠금이있는 스레드 만 중요한 영역으로 들어갈 수 있습니다.

'바'를 동기화하려면이 영역에 들어가기를 원하는 모든 스레드 (또는 '바'에 동기화 된 다른 모든 스레드)가 잠금을 요청해야합니다. 그들이 그것을 얻지 못하면 자물쇠를 소유 한 실이 그것을 놓을 때까지 막히게됩니다.

즉, 모든 벡터가 하나의 변수에 동기화 된 블록에서만 처리되는 경우 일반적으로 충분합니다.

synchronized(bar){..} synchronized(foo){..} 


deadlocks로 이어질 수도로 까다로운 직렬로 연결된 동기화를 가져옵니다 :

synchronized(bar){ 
    synchronized(foo){..} 
} 



그리고 행에 여러 개체에 동기화

도 문제 없다 마지막으로 중요한 것은 :
벡터를 잠궈 두어 각각의 방법으로 스레드 저장하도록하십시오. f 벡터는 synchronized으로 정의됩니다 (here 참조). 다른 스레드의 간섭없이 여러 벡터를 편집하려면 추가 잠금 만 설정하면됩니다.

+0

당신의 대답이 먼저 나에게 분명했다. 간단한 언어에 감사드립니다! –

3

자물쇠가 무엇을 보호할지 결정하는 것은 사용자의 책임입니다. 세 가지 모두를 잠그면 그 세 가지를 모두 잠급니다. 이러한 결정을 객체에 액세스하는 모든 코드에 반영하면됩니다.

잠금과 개체 간의 관계는 잠긴 개체를 다루는 모든 코드에 반영되어야하는 코드 디자인 개념입니다. 경쟁 조건 및 기타 버그를 피하기 위해 프로그래머는 잠금 장치를 사용하여 개체를 보호 할 수 있습니다. 자물쇠 "X"를 잡고 객체 "Y"에 대한 모든 액세스가 수행되도록하려면 잠금 "X"가 객체 "Y"를 잠급니다. 한 번에 하나의 스레드 만 잠금 "X"를 유지할 수 있으므로이 규칙은 한 번에 하나의 스레드 만 개체 "Y"에 액세스하도록합니다. 잠금 장치는 보호 대상이 무엇인지 모르고 관리합니다.

"v1"에 액세스하는 모든 코드가 액세스 할 때 "vList"잠금을 유지하면 "vList"는 "v1"을 잠급니다. "vList"잠금을 유지하지 않고 "v1"에 액세스하는 일부 코드가있는 경우 "vList"는 "v1"을 잠그지 않습니다.

+2

만약 누군가가 downvote 설명 해 주셔서 감사하겠습니다. –

+0

나는 당신이 의미하는 것에 조금 혼란스러워합니다. 동기화되지 않는다 (foo) Java가 후드 잠금 아래에 있다는 의미로 단일 스레드 만이 foo를 만질 수 있다는 의미인가? 왜 이것이 내가 선택할 수 있다는 뜻인가? 내가 잠긴 항목을 syncrhonized()에 넣은 항목이 아닌가? (나는 downvote하지 않았다) –

+1

@ MilanNovaković 아니, 그건 오해! 후드 잠금 장치는 단일 스레드 만 ** ** foo를 잠글 수 있도록합니다. 'foo' 잠금이'foo' 객체를 보호하기를 원한다면,'foo'를 잠그지 않고'foo'를 만지는 코드가없는 것을 확인하는 것은 당신에게 달려 있습니다. 자물쇠는 그들이 무엇을 보호하는지 모른다. (또한, 아이템에 대해 자물쇠를 "가져 오는"의미가 무엇이라고 생각하는지 모르겠지만 혼란처럼 들립니다.) –

1
Vector<T>는 자신의 콘텐츠 스레드 안전하고있다

: 그것은 T 자체의 벡터를 잠그고 내부

  • Vector<Vector<T>>이 벡터의 벡터를 고정되어 있지만 각각의 벡터
  • 각 개별 Vector<T> . 당신이 벡터의 당신의 벡터 내부에서 T의 두 벡터를 얻고, 다른 스레드에이 벡터를 제공하는 경우 즉

, 당신은 서로를 잠금 스레드없이, 동시에 벡터에 액세스 할 수있을 것입니다.

한편, 벡터 벡터를 동시에 액세스하기 시작하면 벡터가 동기화되므로 액세스가 상호 배타적입니다.