一个类的对象锁只有一个,如果有几个非静态函数都是synchronized,在某一时刻只有一个线程能调用其中一个函数
假如一个类有几个静态函数是synchronized,在某一时刻只有一个线程能调用其中一个静态函数吗?也就是类锁也只有一个吗?
巴扎黑2017-04-18 10:51:00
전자는 인스턴스 객체를 잠그고, 현재 객체를 잠급니다. 인스턴스 객체가 여러 개인 경우 이러한 synchronized
메서드는 동기화되지 않습니다. 두 번째 유형의 잠금은 클래스 개체입니다. 클래스 개체는 하나만 있으므로 동기화됩니다.
PHP中文网2017-04-18 10:51:00
으아아아
위 코드에서 볼 수 있듯이 test1 메소드는 test2와 동일합니다. 동일한 객체일 경우 차단이 발생합니다. 물론 서로 다른 객체인지 여부는 중요하지 않습니다. 왜냐하면 이것이 다르기 때문입니다. 객체 수준 잠금이라고 합니다.
Test3은 test4와 동일합니다. 일반적으로 클래스의 클래스 인스턴스가 하나만 있으므로 이 메소드를 입력할 때마다 잠기므로 여기서는 클래스 개체가 잠금으로 사용됩니다. 이를 클래스 수준 잠금이라고 합니다.
大家讲道理2017-04-18 10:51:00
비정적 동기화 방법(A)에서 사용되는 잠금은 현재 인스턴스 개체 자체입니다. 한 인스턴스의 A가 잠금을 획득한 후 인스턴스의 다른 A는 잠금이 해제될 때까지 기다려야 합니다. 인스턴스는 다른 잠금을 사용합니다.
정적 동기화 방법(B)에서 사용하는 잠금은 클래스 개체 자체입니다. 한 B가 잠금을 획득하면 다른 B는 인스턴스가 하나이든 여러 인스턴스이든 잠금이 해제될 때까지 기다려야 합니다.
또한 A와 B 간에 서로 다른 잠금 장치가 사용되므로 경쟁이 발생하지 않습니다.
ringa_lee2017-04-18 10:51:00
Class
클래스는 일반적인 클래스를 표현하기 위해 객체를 생성합니다. 이때 "클래스 잠금"은 이 인스턴스 개체에 대한 잠금입니다
伊谢尔伦2017-04-18 10:51:00
"뮤텍스 잠금" 개념에 대해 이야기하고 있는 경우 동기화 수정 방법에는 두 가지 상황이 있습니다.
【비정적 방식】
Synchronized에 의해 메소드가 수정되면 잠금 객체는 현재 메소드가 속한 객체가 되는데, 이것이 메소드에 있습니다.
【정적 방식】
동기화된 정적 메서드를 수정하는 경우 정적 메서드에 의해 잠긴 개체는 현재 클래스 개체(Class 클래스의 인스턴스)입니다. 각 클래스에는 고유한 클래스 개체가 있습니다. 클래스 객체를 얻는 방법: classname.class.
상호 배타적인 시나리오의 경우 다음 두 가지 사항을 이해해야 합니다.
1. 정적 메서드와 비정적 메서드는 동시에 동기화되어 선언되며, 둘 사이에는 상호 배타적이지 않은 관계가 있습니다. 그 이유는 정적 메소드가 현재 메소드가 속한 객체가 아닌 클래스 객체를 잠그기 때문입니다.
2. 동기화가 두 개의 서로 다른 코드 조각을 수정했지만 잠금 개체가 동일한 경우 두 스레드는 각각 두 코드 조각을 호출할 때 상호 배타적입니다.
그래서 "하나의 스레드만 한 번에 하나의 함수를 호출할 수 있다"(즉, 상호 배제)라고 말할 때 판단 조건은 메서드 유형에 관계없이 잠금 개체가 동일한지 여부입니다.
伊谢尔伦2017-04-18 10:51:00
객체 메소드의 동기화 수정의 경우 잠금은 객체 자체입니다.
정적 메소드의 동기화 수정의 경우 잠금은 클래스 로더가 생성한 클래스 객체인 Class 객체 자체입니다.