>  기사  >  Java  >  동기화에 사용되는 네 가지 방법 소개

동기화에 사용되는 네 가지 방법 소개

不言
不言앞으로
2018-10-08 15:16:523334검색

이 글은 동기화를 사용하는 네 가지 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 메소드 수정
synchronized 메소드 수정은 매우 간단합니다. 메소드 앞에 동기화를 추가하기만 하면 됩니다. 예:

public synchronized void method()
{
   // todo
}

인터페이스 메소드를 정의할 때 동기화 키워드를 사용할 수 없습니다.
생성자 메서드는 동기화된 키워드를 사용할 수 없지만 동기화를 위해 동기화된 코드 블록을 사용할 수 있습니다.
동기화된 키워드는 상속될 수 없습니다. 동기화하려면 키워드를 명시적으로 추가해야 합니다.
Synchronized 키워드로 수정된 메서드는 재정의된 경우 기본적으로 비동기화됩니다. 동기화하려면 명시적으로 키워드를 추가해야 합니다. 그렇지 않으면 상위 부모 클래스의 메서드가 동기화와 동일합니다.

2. 코드 블록을 수정하세요

public  void method()
{
   synchronized(this)
   synchronized(XX.class)
}

synchronized(this)는 현재 개체가 여러 개인 경우 여기에는 동일한 개체만 잠글 수 있습니다.
synchronized(XX.class) 이 잠금은 이 유형의 클래스인 한 유용합니다.

두 개의 동시 스레드가 동일한 개체 개체의 동기화된(this) 동기화 코드 블록에 액세스할 때 한 번에 하나씩만 있을 수 있습니다. 스레드가 실행됩니다. 다른 스레드는 이 코드 블록을 실행하기 전에 현재 스레드가 이 코드 블록 실행을 완료할 때까지 기다려야 합니다. 스레드가 개체의 동기화된(this) 동기화 코드 블록에 액세스하면 다른 스레드는 여전히 개체의 동기화되지 않은(this) 동기화 코드 블록에 액세스할 수 있습니다. 특히 중요한 점은 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스할 때 객체의 다른 모든 동기화된(this) 동기화 코드 블록에 대한 다른 스레드의 액세스가 차단된다는 것입니다.
세 번째 예는 다른 동기화된 코드 블록에도 적용됩니다. 즉, 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 이 객체의 객체 잠금을 획득합니다. 결과적으로 개체 개체의 모든 동기화된 코드 부분에 대한 다른 스레드의 액세스가 일시적으로 차단됩니다.
위 규칙은 다른 개체 잠금에도 적용됩니다.

3. 정적 메서드 수정
우리는 정적 메서드가 개체가 아닌 클래스에 속한다는 것을 알고 있습니다. 마찬가지로, 동기화로 수정된 정적 메서드는 이 클래스의 모든 개체를 잠그며, 모든 클래스를 사용할 때 이 유형의 클래스인 한 작동하는 개체는 모두 잠금 효과를 갖습니다. 개체 수에 관계없이 작동합니다. 다음 코드

public synchronized static void method() {
   // todo
   }

요약:A. 동기화된 키워드가 메서드에 추가되었는지 객체에 추가되었는지에 관계없이 해당 키워드가 작동하는 객체가 비정적이면 객체가 동기화된 경우 획득하는 잠금은 객체입니다. 작동하는 것이 정적 메서드이거나 클래스가 클래스인 경우 획득한 잠금은 클래스의 모든 개체에 대해 동일한 잠금입니다.
B. 각 개체에는 연결된 잠금이 하나만 있습니다. 이 잠금을 얻은 사람은 해당 개체가 제어하는 ​​코드를 실행할 수 있습니다.

C. 동기화를 달성하려면 시스템 오버헤드가 많이 필요하고 교착 상태가 발생할 수도 있으므로 불필요한 동기화 제어를 피하십시오.

D. 동기화 키워드는 개체를 잠급니다

위 내용은 동기화에 사용되는 네 가지 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제