如果實例的方法是同步的,那麼執行緒的執行就會變成每個實例一個執行緒的執行,但是當同一個類別的實例有多個時,就會出現一個問題,需要在類別層級進行同步,以便只提供Java 中的靜態同步可以透過兩種方式執行,一種是使用靜態同步方法,另一種是使用同步區塊靜態方法中的程式碼。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
文法如下:
synchronized static return_type class_name{}
其中傳回類型是從類別傳回值的類型,class_name 是類別的名稱。
Java中類別的每個實例都對該類別的物件有一個鎖。如果任何靜態方法被同步,那麼鎖就不是在類別的物件上,而是在類別本身上。假設一個類別有兩個對象,分別稱為 obj1 和 obj2,並且線程 t1 和 t2 正在對對象 obj1 進行操作。同樣,線程 t3 和 t4 正在物件 obj2 上進行操作。如果程式碼區塊或方法被同步,則執行緒 t1 和 t2 之間不會存在幹擾,因為執行緒 t1 和 t2 都引用具有單一鎖的同一個物件 obj1。同樣,線程 t3 和 t4 之間也不可能存在幹擾,因為線程 t3 和 t4 都引用具有單鎖的同一個物件 obj2。
但是線程 t1 和 t3 之間可能存在幹擾,因為線程 t1 和 t3 都使用不同的鎖定獲取了不同的物件。同樣,線程t2和t4之間也可能存在幹擾,因為線程t2和t4都獲得了具有不同鎖的不同物件。我們不希望任何執行緒之間出現任何形式的干擾,這個問題可以透過使用 Java 中的靜態同步來解決。當第一次載入類別時,Java 虛擬機會會建立類別物件。第一次載入同一個類別後,不會再載入該類別。 Java 虛擬機器為載入的每個類別建立一個類別的實例。這些類別的實例稱為對象,而物件同步可以使用 Java 中的靜態同步來完成。
以下是範例:
示範 Java 靜態同步的程式:
代碼:
//a class called check is defined class check { // a method called Line is define and only one thread will be able to access this method at once because it is synchronized synchronized public void Line() { //a for loop is defined to loop from values 0 to 3 for (int r = 1; r <5; r++) { System.out.println(r); try { Thread.sleep(390); } catch (Exception ex) { System.out.println(ex); } } } } //a class called Trap is defend which extends a thread of the class class Trap extends Thread { //a variable of the class check is defined check line1; //a constructor of the class trap is defined with check class variable Trap(check line1) { this.line1 = line1; } //the standard run method is overridden public void run() { line1.Line(); } } //a class called program is defined public class program { //main method is called public static void main(String[] args) { //an instance of the class check is defined check object = new check(); // two threads of the class trap is created and they share the same object Trap tra1 = new Trap(object); Trap tra2 = new Trap(object); //Beginning the execution of two threads tra1.start(); tra2.start(); } }
輸出:
說明:在上面的程式中,定義了一個名為check的類別。然後定義了一個名為 Line 的方法,一次只有一個執行緒能夠存取該方法,因為它是同步的。然後定義一個 for 迴圈從值 0 到 3 迴圈。然後保護一個名為 Trap 的類,它擴展了該類的線程。然後定義了類別check的一個變數。類別陷阱的建構子以檢查類別變數作為參數定義。然後標準運行方法被覆蓋。然後定義一個名為program的類別。然後呼叫main方法。然後定義類別檢查的實例。然後創建類別陷阱的兩個執行緒tra1和tra2,它們共享同一個物件。然後,兩個執行緒tra1和tra2的執行以這樣的方式開始:一個執行緒的執行不中斷另一個執行緒的執行或一個執行緒的執行不鎖定另一個執行緒的執行。程式的輸出如上面的快照所示。
有幾個優點。他們是:
在本教程中,我們透過定義來了解 Java 中靜態同步的概念、在 Java 中聲明靜態同步的語法、透過範例了解 Java 中靜態同步的工作原理及其輸出以及 Java 中靜態同步的優點。
以上是Java 中的靜態同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!