2017-10-20 88 views
-1

我有一種方法,一次只能由一個線程訪問。即使線程使用不同的對象,一次只能有一個線程訪問該方法。如何確保使用多個對象的多個線程可以訪問互斥的代碼部分

我可以在Java中使用什麼來實現這一目標? 我認爲'synchronized'關鍵字將允許多個線程一次訪問該方法,如果他們使用不同的對象。 我相信與重入鎖相同。

+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中,我看到使用'靜態同步方法'意味着我必須使用方法中的靜態內容,這是一個問題。 所以我開始使用#5這是一個很好的方式來做事情。使用此功能時不需要其他更改。 – hars

相關問題