Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API與框架

Java 類引用

Java 有用資源

Java - 靜態同步



同步 是一種建立多個執行緒之間協作的方法,這些執行緒試圖訪問共享資源。對於可靠的執行緒互動,同步是必要的,並且使用“synchronized”關鍵字完成。在這裡,執行緒是大型操作的小型子程序。在本文中,我們將學習靜態同步以及它們如何管理執行緒以便它們能夠高效地工作。

多執行緒

多執行緒Java程式語言的一個特性,它允許我們同時執行多個操作。在多執行緒中,操作被分成多個稱為執行緒的較小部分。每個執行緒執行一個獨立的任務,而不會影響其他執行緒的效能。多執行緒的主要好處是最佳化資源利用,例如 CPU,並縮短分配操作的執行時間。

同步

執行緒以非同步方式執行,因此無法預測它們將如何互動。有時,多個執行緒可能試圖訪問單個資源,然後出現問題,因為它可能會導致分配任務的錯誤結果。此時,同步就發揮作用,它確保一次只有一個執行緒可以訪問給定的資源。這是因為鎖物件保護了同步區域。當一個執行緒進入該區域時,鎖將分配給它,並在執行其任務後釋放鎖。在資源繁忙期間,其他執行緒將排隊等待。

Java中的靜態同步

當我們使用這種型別的同步時,如果一個執行緒位於靜態同步區域,則嘗試訪問此區域的所有其他執行緒都將被阻塞。由於靜態方法屬於類,因此靜態同步應用類級鎖。

靜態同步的語法

static synchronized returnType nameOfMethod( Type parameters) {
	// code
} 

這裡returnType可以是void或任何基本資料型別。parameters包含變數名後跟資料型別。

無靜態同步的多執行緒

這是一個簡單的例子,它可能按順序列印計數器值,也可能不按順序列印計數器值,每次執行它時,它都會根據CPU對執行緒的可用性產生不同的結果。

無靜態同步的多執行緒示例

package com.tutorialspoint;

class PrintDemo {
   public static void printCount() {
      try {
         for(int i = 5; i >  0; i--) {
            Thread.sleep(50);
            System.out.println("Counter   ---   "  + i );
         }
      } catch (Exception e) {
         System.out.println("Thread  interrupted.");
      }
   }
}

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;

   ThreadDemo( String name) {
      threadName = name;
   }
   
   public void run() {
      PrintDemo.printCount();
      System.out.println("Thread " +  threadName + " exiting.");
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {
   public static void main(String args[]) {
      ThreadDemo t1 = new ThreadDemo( "Thread - 1 " );
      ThreadDemo t2 = new ThreadDemo( "Thread - 2 " );

      t1.start();
      t2.start();

      // wait for threads to end
         try {
         t1.join();
         t2.join();
      } catch ( Exception e) {
         System.out.println("Interrupted");
      }
   }
}

每次執行此程式都會產生不同的結果。

輸出

Starting Thread - 1 
Starting Thread - 2 
Counter   ---   5
Counter   ---   5
Counter   ---   4
Counter   ---   4
Counter   ---   3
Counter   ---   3
Counter   ---   2
Counter   ---   2
Counter   ---   1
Counter   ---   1
Thread Thread - 1  exiting.
Thread Thread - 2  exiting.

帶靜態同步的多執行緒

這是一個相同的例子,它按順序列印計數器值,每次執行它時,它都會產生相同的結果。這次我們在方法上添加了synchronized關鍵字,以便在方法執行期間根據物件鎖定整個方法。

帶靜態同步的多執行緒示例

package com.tutorialspoint;

class PrintDemo {
   public static synchronized void printCount() {
      try {
         for(int i = 5; i >  0; i--) {
            Thread.sleep(50);
            System.out.println("Counter   ---   "  + i );
         }
      } catch (Exception e) {
         System.out.println("Thread  interrupted.");
      }
   }
}

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;

   ThreadDemo( String name) {
      threadName = name;
   }
   
   public void run() {
      PrintDemo.printCount();
      System.out.println("Thread " +  threadName + " exiting.");
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {
   public static void main(String args[]) {
      ThreadDemo t1 = new ThreadDemo( "Thread - 1 " );
      ThreadDemo t2 = new ThreadDemo( "Thread - 2 " );

      t1.start();
      t2.start();

      // wait for threads to end
         try {
         t1.join();
         t2.join();
      } catch ( Exception e) {
         System.out.println("Interrupted");
      }
   }
}

每次執行此程式都會產生以下結果:

輸出

Starting Thread - 1 
Starting Thread - 2 
Counter   ---   5
Counter   ---   4
Counter   ---   3
Counter   ---   2
Counter   ---   1
Thread Thread - 1  exiting.
Counter   ---   5
Counter   ---   4
Counter   ---   3
Counter   ---   2
Counter   ---   1
Thread Thread - 2  exiting.
廣告