同步是一种在尝试访问共享资源的多个线程之间建立合作的方式。它对于可靠的线程交互是必要的,并且使用"synchronized"关键字来完成。

在本文中,我们将学习静态同步以及它们如何管理线程,以便它们能够高效工作。

多线程

它是 Java 编程语言的一项功能,使我们能够同时执行多个操作。其中,操作被分为多个较小的部分,称为线程。每个线程执行一项独立的任务,而不影响其他线程的性能。多线程的主要好处是优化使用 CPU 等资源,并提高分配操作的执行时间。

同步

线程以异步方式执行,因此,无法预测他们将如何互动。有时,多个线程可能尝试访问单个资源,然后会出现问题,因为它可能会创建分配任务的错误结果。这时,同步就派上用场了,它确保单个线程可以同时访问给定的资源。这是可能的,因为有锁对象保护同步区域。当线程进入该区域时,锁就会分配给它,并在执行任务后释放锁。直到资源繁忙,其他线程才会在队列中等待。

静态同步

当我们使用这种类型的同步时,如果一个线程位于静态同步区域中,所有其他尝试访问该区域的线程都将被阻止。由于静态方法属于类,因此静态同步应用类级锁。

语法

static synchronized returnType nameOfMethod( Type parameters) {
	// 代码
} 

这里returnType可以是void或任何原始数据类型。 参数包含变量名称,后跟数据类型。

无静态同步的多线程示例

这是一个简单的示例,可能会也可能不会打印计数器值序列,每次运行它时,它都会根据线程的 CPU 可用性产生不同的结果。

示例

package com.yxjc123;

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();

      //等待线程结束
         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. 

静态同步的多线程示例

这是按顺序打印计数器值的相同示例,每次运行它时,它都会产生相同的结果。这次我们将同步关键字放在方法上,以便在方法执行期间根据对象锁定完整的方法。

示例

package com.yxjc123;

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();

      //等待线程结束
         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.