我有一種方法,一次只能由一個線程訪問。即使線程使用不同的對象,一次只能有一個線程訪問該方法。如何確保使用多個對象的多個線程可以訪問互斥的代碼部分
我可以在Java中使用什麼來實現這一目標? 我認爲'synchronized'關鍵字將允許多個線程一次訪問該方法,如果他們使用不同的對象。 我相信與重入鎖相同。
我有一種方法,一次只能由一個線程訪問。即使線程使用不同的對象,一次只能有一個線程訪問該方法。如何確保使用多個對象的多個線程可以訪問互斥的代碼部分
我可以在Java中使用什麼來實現這一目標? 我認爲'synchronized'關鍵字將允許多個線程一次訪問該方法,如果他們使用不同的對象。 我相信與重入鎖相同。
這裏有一些變化。如果我理解了這個問題,我認爲你正在尋找#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
}
}
您鎖定共享對象,例如,使用存儲在'static'字段中的'ReentrantLock',或者在'static'字段中存儲的'Object'中使用'synchronized'。 – Andreas