Java 다 중 스 레 드(3):Synchronized 상세 설명
Synchronized 방법 잠 금 및 코드 잠 금
// (1) -
public synchronized void a() {}
// (2) -
public static synchronized void a() {}
// (1) -
public void a() {
synchronized(syncObject){
}
}
// (2) -
public void a() {
synchronized(XXX.class){
}
}
Synchronized 대상 잠 금 및 클래스 잠 금
대상 잠 금
4.567917.같은 시간 에 하나의 스 레 드 만 인 스 턴 스 대상 잠 금 의 사용권 을 얻 을 수 있 고 이 대상 의 잠 금 방법 을 실행 할 수 있 습 니 다.다른 스 레 드 는 이 스 레 드 가 잠 금 내 방법 을 실행 해 야 대상 잠 금 의 사용권 을 선점 할 수 있 습 니 다
public class Main {
public static void main(String[] args) {
SyncTest s1 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s1.b()).start();
}
public static class SyncTest {
public synchronized void a() {
try {
System.out.println(Thread.currentThread().getId() + ":--a--start , " + System.currentTimeMillis());
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getId() + ":--a--end , " + System.currentTimeMillis());
}catch (Exception e){
e.printStackTrace();
}
}
public synchronized void b() {
System.out.println(Thread.currentThread().getId() + ":--b--start , " + System.currentTimeMillis());
}
public void c() {
System.out.println(Thread.currentThread().getId() + ":--b--start , " + System.currentTimeMillis());
}
}
}
4
SyncTest s1 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s1.c()).start();
}
4.567917.유형의 서로 다른 사례 대상 간 에 서로 영향 을 주지 않 는 다.
SyncTest s1 = new SyncTest();
SyncTest s2 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s2.a()).start();
클래스 잠 금
4.567917.두 스 레 드 가 서로 다른 대상 의 잠 금 정태 방법 을 동시에 방문 하면 경쟁 을 막 을 수 있다
public class Main {
public static void main(String[] args) {
SyncTest s1 = new SyncTest();
SyncTest s2 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s2.a()).start();
}
public static class SyncTest {
public static synchronized void a() {
try {
System.out.println(Thread.currentThread().getId() + ":--a--start , " + System.currentTimeMillis());
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getId() + ":--a--end , " + System.currentTimeMillis());
}catch (Exception e){
e.printStackTrace();
}
}
public synchronized void b() {
System.out.println(Thread.currentThread().getId() + ":--b--start , " + System.currentTimeMillis());
}
}
}
4.567917.그러나 비 유형 잠 금 방법(즉 대상 잠 금 방법)을 방문 할 때 경쟁 과 차단 이 발생 하지 않 습 니 다
SyncTest s1 = new SyncTest();
SyncTest s2 = new SyncTest();
new Thread(()->s1.a()).start();
new Thread(()->s2.b()).start();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.