首頁  >  文章  >  Java  >  Java 中的靜態同步

Java 中的靜態同步

WBOY
WBOY原創
2024-08-30 15:59:04809瀏覽

如果實例的方法是同步的,那麼執行緒的執行就會變成每個實例一個執行緒的執行,但是當同一個類別的實例有多個時,就會出現一個問題,需要在類別層級進行同步,以便只提供Java 中的靜態同步可以透過兩種方式執行,一種是使用靜態同步方法,另一種是使用同步區塊靜態方法中的程式碼。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

文法

文法如下:

synchronized static return_type class_name{}

其中傳回類型是從類別傳回值的類型,class_name 是類別的名稱。

Java 中靜態同步如何運作?

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 中實作靜態同步的範例

以下是範例:

範例#1

示範 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();
}
}

輸出:

Java 中的靜態同步

說明:在上面的程式中,定義了一個名為check的類別。然後定義了一個名為 Line 的方法,一次只有一個執行緒能夠存取該方法,因為它是同步的。然後定義一個 for 迴圈從值 0 到 3 迴圈。然後保護一個名為 Trap 的類,它擴展了該類的線程。然後定義了類別check的一個變數。類別陷阱的建構子以檢查類別變數作為參數定義。然後標準運行方法被覆蓋。然後定義一個名為program的類別。然後呼叫main方法。然後定義類別檢查的實例。然後創建類別陷阱的兩個執行緒tra1和tra2,它們共享同一個物件。然後,兩個執行緒tra1和tra2的執行以這樣的方式開始:一個執行緒的執行不中斷另一個執行緒的執行或一個執行緒的執行不鎖定另一個執行緒的執行。程式的輸出如上面的快照所示。

Java 中靜態同步的優點

有幾個優點。他們是:

  • 使用Java中的靜態同步可以解決資料不一致的問題。
  • 透過在Java中使用靜態同步,一個物件在給定的時間點只能被一個執行緒存取。只能由一個執行緒存取的物件必須使用關鍵字synchronized聲明。
  • Java中可以使用靜態同步來管理不同執行緒和不同進程的並發。即兩個或多個線程,或兩個或多個進程可以同時執行,確保一個線程不會鎖定或中斷其他線程的執行。

結論

在本教程中,我們透過定義來了解 Java 中靜態同步的概念、在 Java 中聲明靜態同步的語法、透過範例了解 Java 中靜態同步的工作原理及其輸出以及 Java 中靜態同步的優點。

以上是Java 中的靜態同步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn