簡體   English   中英

里面有一個同步塊的靜態方法,在Java中阻塞整個類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM