2012-12-13 3 views
0

, 내가 가진하시기 바랍니다 의심을 처리자바 동기화는 동기화 된 블록과 아래의 시나리오 동기화 방법 사이

Class table 
{ 
    Synchronized(this) 
    { 
     …………………… 
    } 
} 

여기 테이블 클래스의 객체를 잠갔습니다. -------------------------------------- ...

2 부 :

Class table 
{ 
    Customer cust=new Customer(); 
    Synchronized(cust) 
    { 
     …………………… 
    } 
} 

여기서 우리는 고객의 물건에 자물쇠가 붙었다 part1에서 우리는? - table 클래스의 물건을 잠근다. 테이블 클래스의 객체가 동기화 된
블록에 동시에 액세스하려고 할 수 있으므로 테이블 클래스를 잠급니다.이를 방지하기 위해 part1에서 테이블 클래스
의 객체를 잠급니다. 이제 part2에 오셨습니까? - - 여기 고객 클래스의 객체를 잠갔습니다 ------------------------------- ------- ...

내 의심 :

  1. 왜 우리는 파트 2에서 테이블 클래스가 아닌 다른 테이블 클래스의 객체를 고정해야합니까?

  2. 우리는 2 부에서의 Cust에 고정되지 않을 경우, 우리는 우리의 Cust 잠금 다음 또한 우리가 동기화 블록에 액세스하는 테이블 클래스의 객체가 필요한 경우 테이블 에게 클래스 를 사용하여 동기화 블록에 액세스 할 수 있습니다. 동기화 된 블록에 액세스하는 데 필요한 테이블 클래스의 개체입니다. 동기화로 인해 테이블 ​​클래스의 객체가 서로 다른 스레드에서 동기화 된 블록
    에 동시에 액세스하지 못하게했습니다. 그런데 왜 테이블 클래스에서 테이블 클래스가 아닌 다른 개체를 잠 가야합니까?

  3. 고객 클래스의 객체가
    다른 위치에서 동시에 동기화 된 블록에 액세스하려고합니까?

  4. 파트 2에서 우리는 테이블 클래스 이외의 다른 객체를 잠갔습니다. In Table 클래스 이외의 클래스의 개체에서 테이블 클래스를 잠그는 상황이
    part2에서 고객 클래스의 개체에 잠기는 이점은 무엇입니까?

  5. 고객 클래스의 개체, 즉 테이블 클래스 이외의 개체를 잠글 필요가 있습니까?

  6. 파트 2에서 고객 클래스의 객체를 잠그지 않으면 어떤 피해가 발생합니까?

제발, 저는 자바 스레드에 익숙하지 않습니다. 잠시 동안 그 질문을 머리에 쓰려고했습니다. 명확한 설명이 도움이 될 것입니다. 감사합니다

+0

모노 스페이스 글꼴이 텍스트를 읽기 어렵다는 것을 알고 있습니까? 코드 블록에서 텍스트를 떼어도 되겠습니까? –

+0

서식을 수정하는 것이 좋습니다. 또한 Java 동기화는 널리 논의되는 주제이므로 이미 StackOverflow에서 살펴본 내용을 언급해야합니다. –

+0

Google에서 "Java가 수행하는 작업"을 검색 할 때 첫 번째 히트가 다음 질문에 해당합니다. http://stackoverflow.com/questions/1085709/what-does-synchronized-mean –

답변

1

먼저 체크 아웃해야 할 일은 다음과 같습니다 : 어떤 종류의 데이터 필드는 다른 유형의 "동기화 된"키워드로 보호됩니다.

정적 변수 변수/메소드는 클래스 레벨 객체이며 다른 모든 변수/메소드는 인스턴스 수준입니다.

클래스 수준의 잠금은 해당 잠금이 해제되지 않을 때까지 클래스의 모든 개체를 대기시키는 잠금입니다.

Class A{ 
static synchronized void foo(){} 
} 

다음은 메소드 foo를 동기화하고 객체가 현재 푸 메소드가 실행을 완료 실행까지 클래스의 모든 개체에 따라서 모든 스레드가 대기합니다.

마찬가지로 인스턴스 수준 잠금은 클래스 인스턴스를 사용하여 시작된 모든 스레드가 잠금이 해제되지 않을 때까지 대기하도록 만듭니다.

Class A{ 
synchronized void bar(){} 
} 

현재 bar 메서드를 실행중인 개체에서 시작된 모든 스레드는 현재 스레드가 실행을 완료 할 때까지 대기합니다. 다른 객체의 다른 스레드는 bar 메소드를 실행할 수 있지만 다른 객체의 스레드는 bar 메소드를 실행 중입니다.

즉, 적절한 객체 잠금을 보유 할 때까지 스레드는 동기화 된 코드 블록을 입력 할 수 없습니다.

instance methods의 경우 이는 인스턴스 잠금입니다.

static methods의 경우 이것은 Class 객체 잠금입니다.

0

기존 코드를 분석하여 동기화가 필요한 이유를 파악한 것 같습니다.

part1과 part2 코드가 같은 기능을합니까?

두 번째 부분에서는 동기화가 의미가 없습니다. 고객 오브젝트를 작성한 후 동기화해도 아무 효과가 없습니다. 두 번째 스레드는 새 고객 오브젝트를 작성하고 해당 오브젝트를 잠급니다.

기존 코드를 변경해야하는 경우 테스트 사례를 작성할 수 있으며 span은 스레드를 생성하고 동기화를 제거하여 멀티 스레딩 문제를 일으킬 수 있는지 확인할 수 있습니다.