>  기사  >  Java  >  동기화와 정적 동기화의 차이점

동기화와 정적 동기화의 차이점

高洛峰
高洛峰원래의
2016-12-13 11:18:171312검색

1. 동기화와 정적 동기화의 차이점
동기화는 다른 스레드가 클래스 인스턴스의 모든 동기화 블록에 동시에 액세스하는 것을 방지하기 위해 클래스의 현재 인스턴스를 잠급니다. 클래스의 인스턴스". 클래스의 서로 다른 두 인스턴스에는 이 제약 조건이 없습니다. 그런 다음 정적 동기화가 발생하여 클래스의 모든 인스턴스에 대한 액세스를 제어합니다. 정적 동기화는 스레드가 jvm에 있는 클래스의 모든 인스턴스에 동시에 액세스하고 해당 코드에 액세스하는 것을 제한합니다. 실제로 클래스의 메서드나 코드 블록에 동기화가 있는 경우 클래스의 인스턴스를 생성한 후 클래스에는 모니터링 블록이 있고 스레드가 인스턴스에 액세스할 수 있도록 동기화 보호 블록이 배치됩니다. 동시에 정적 동기화는 이 클래스의 모든 인스턴스가 공통 모니터를 공유합니다. 이는 둘 사이의 차이점입니다. 즉, 동기화는 this.synchronized와 동일하고
정적 동기화는 Something.synchronized와 동일합니다.
일본 작가인 Jie Chenghao의 "Java 멀티스레딩 디자인 패턴"의 예는 다음과 같습니다.
public class Something(){
public synced void isSyncA(){}
publicsynchronous void isSyncB(){}
공개 정적 동기화 무효 cSyncA(){}
                                                                                                                                                   동시에 Access
a. x.isSyncA() 및 x.isSyncB()
b. x.cSync 에이( ) 및 y.cSyncB( )
d. x.isSyncA() 및 Something.cSyncA()
여기서는 명확하게 판단할 수 있습니다.
a, 둘 다 동일한 인스턴스의 동기화된 도메인에 액세스하므로 동시에 액세스
b는 다른 인스턴스용이므로 동시에 액세스할 수 있습니다.
c, 정적 동기화이므로 다른 인스턴스는 여전히 제한됩니다. Something.isSyncA()와 동일합니다. 및 Something.isSyncB()이므로 동시에 액세스할 수 없습니다.
그럼 d는 어떨까요? 책에 나온 답변은 동시에 접근이 가능하다고 답변한 이유는 동기화된 인스턴스 메소드와 동기화된 클래스 메소드가 서로 다른 잠금을 갖고 있기 때문입니다.
개인적인 분석으로는 동기화와 정적 동기화가 두 개의 갱과 동일하며 서로에 대한 제한이 없으며 동시에 액세스할 수 있습니다. Java의 내부 디자인 동기화가 어떻게 구현되는지는 아직 명확하지 않습니다.


결론: A: 동기화된 정적은 특정 클래스의 범위이며, 동기화된 정적 cSync{}는 여러 스레드가 이 클래스의 동기화된 정적 메서드에 동시에 액세스하는 것을 방지합니다. 클래스의 모든 객체 인스턴스에서 작동합니다.

B: 동기화는 인스턴스의 범위입니다. 동기화 isSync(){}는 여러 스레드가 이 인스턴스의 동기화 메서드에 동시에 액세스하는 것을 방지합니다.


2. 동기화 메소드와 동기화 코드의 차이점

동기화 메소드(){}와 동기화(this){}는 차이가 없고 단지 동기화 메소드(){ }는 읽고 이해하기 쉽고, 동기화된(this){}은 충돌 제한 액세스 영역을 더 정확하게 제어할 수 있으며 때로는 더 효율적으로 수행될 수 있습니다.


3. 동기화 키워드는 상속받을 수 없습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.