[英]static method with a synchronized block inside, blocks the entire class in java?
我有一個執行3個線程的類,並在每個詢問的線程上檢查全局變量。 我試圖分別鎖定每個變量,我不想每次更改一個變量時都阻塞整個類。 我研究了一下,但仍然感到困惑。 在這種情況下,由於必須訪問每個線程中的變量,因此必須使方法靜態化,所以我的問題是:每次調用getter和setter時,我是阻塞每個變量還是整個類?
public class MyClass {
private static boolean bool1= false;
private static boolean bool2= false;
public static void main(String[] args) {
//run Thread1
//run Thread2
//run thread3
}
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public static boolean isBool1() {
synchronized(lock1) {
return bool1;
}
}
public static void setBool1(boolean bool) {
synchronized(lock1) {
MyClass.bool1= bool1;
}
}
public static boolean isBool2() {
synchronized(lock2) {
return bool2;
}
}
public static void setBool2(boolean bool2) {
synchronized(lock2) {
MyClass.bool2= bool2;
}
}
}
不,您沒有阻塞該類,您的靜態方法沒有聲明為已同步,也沒有阻塞該類的實例,因為您的類沒有實例。
但是,不必為了從單獨的線程中調用它們而將方法聲明為靜態。 如果您未聲明任何靜態內容並在單個實例上調用方法,則您的代碼將以相同的方式工作。 這也將是一個更好的方法,通常不需要聲明不需要的靜態內容。 這使得在多線程或共享VM(例如應用程序服務器)方案中難以使用您的代碼。
與在單個對象上自由使用synced關鍵字相比,通常還有更好的方法來實現線程安全。 您可以考慮將BlockingQueue與配置為使用單個線程的ThreadPoolExecutor一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.