2017-10-20 8 views
-1

한 번에 하나의 스레드에서 액세스 할 수있는 방법이 있습니다. 스레드가 다른 객체를 사용하더라도, 한 번에 하나의 스레드 만 메소드에 액세스해야합니다.여러 객체를 사용하는 여러 스레드가 상호 배타적 인 코드 일부에 액세스 할 수 있는지 확인하는 방법

Java에서 사용할 수있는 항목은 무엇입니까? 다른 개체를 사용하는 경우 '동기화 된'키워드를 사용하면 한 번에 여러 스레드에서 메서드에 액세스 할 수 있습니다. 내가 믿는 Re-Entrant 잠금 장치와 동일합니다.

+0

공유 객체를 잠급니다. 'static' 필드에 저장된'ReentrantLock'을 사용하거나'static' 필드에 저장된'Object'에'synchronized'를 사용하십시오. – Andreas

답변

1

몇 가지 변형이 있습니다. 내가 그 질문을 올바르게 이해한다면, 나는 당신이 # 5를 찾고 있다고 생각한다.

// 1. Static method 
public static synchronized void doSomething() { 
    // Mutually exclusive for all calls 
} 

// 2. Static w/ Shared lock 
private static Object STATIC_LOCK = new Object(); 

public static void staticMethod1() { 
    synchronized (STATIC_LOCK) { 
     // Mutually exclusive across staticMethod1() and staticMethod2() 
    } 
} 

public static void staticMethod2() { 
    synchronized (STATIC_LOCK) { 
     // Mutually exclusive across staticMethod1() and staticMethod2() 
    } 
} 

// 3. Instance method 
public synchronized void doSomethingElse() { 
    // Mutually exclusive per instance of class 
} 

// 4. Instance w/ Shared lock 
private Object lock = new Object(); 

public static void method1() { 
    synchronized (lock) { 
     // Mutually exclusive across method1() and method2() for each class instance 
    } 
} 

public static void method2() { 
    synchronized (lock) { 
     // Mutually exclusive across method1() and method2() for each class instance 
    } 
} 

// 5. Instance method synchronization across multiple class instances 
private static Object SHARED_LOCK = new Object(); 

public void commonInstanceMethod() { 
    synchronized (SHARED_LOCK) { 
     // Mutually exclusive across all class instances 
    } 
} 
+0

얼마나 많은 객체를 가지고 있든 관계없이 하나의 스레드 만 액세스 할 수 있기 때문에 첫 번째를 사용 중입니다. – hars

+0

@hars : # 1과 # 5는 본질적으로 같은 것입니다. –

+0

# 1에서 'static synchronized method'를 사용하는 것은 메서드 내에서 정적 내용을 사용해야한다는 것을 의미합니다. 그래서 # 5를 사용하기 시작했는데 이는 꽤 좋은 방법입니다. 이를 사용할 때 다른 변경은 필요하지 않습니다. – hars