Java 中的静态同步

javaobject oriented programmingprogramming更新于 2024/8/17 13:20:00

同步是一种在尝试访问共享资源的多个线程之间建立协作的方式。它是可靠的线程交互所必需的,使用"synchronized"关键字完成。在这里,线程是一个大操作的小子进程。在本文中,我们将学习静态同步以及它们如何管理线程,以便它们能够高效工作。

多线程和静态同步

多线程

它是 Java 编程语言的一项功能,允许我们同时执行多个操作。在其中,操作被分成多个较小的部分,称为线程。每个线程执行一个独立的任务,而不会影响其他线程的性能。多线程的主要好处是可以最佳地利用 CPU 等资源,并提高分配操作的执行时间。

同步

线程以异步方式执行,因此无法预测它们将如何交互。有时,多个线程可能会尝试访问单个资源,然后就会出现问题,因为它可能会导致分配的任务产生错误的结果。此时,同步就会出现,并确保单个线程可以一次访问给定的资源。这是可能的,因为锁对象保护着同步区域。当一个线程进入该区域时,锁就会被分配给它,它在执行任务后会释放锁。在资源繁忙之前,其他线程会在队列中等待轮到它们。

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

语法

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

returnType 可能是 void 或任何原始数据类型。

parameters 包含变量名称,后跟数据类型。

Java 中的静态同步程序

代码的工作

  • 创建一个名为"Thrd"的类,并在其中定义一个名为"operation()"的静态同步方法以及一个参数。

  • 现在,在此方法中,进行一个 for 循环,该循环将运行 4 次并增加给定的参数。此循环的 try 块将以指定的时间间隔(即 1000 毫秒)打印输出。

  • 进一步,创建三个扩展"Thread"类的类。在这些类中,将参数传递给"operation()"方法。

  • 最后,在主方法中为线程类创建三个对象,并使用内置方法"start()"执行它们。

示例

class Thrd {
   static synchronized void operation(int data) {
      for(int i = 1; i <= 4; i++) {
         System.out.println(data++);   
         try {
            // 每次迭代间隔 1 秒
            Thread.sleep(1000);   
         } catch(Exception exp){}   
      }
   }
}
class Thrd1 extends Thread {
   // thread number 1 
   public void run() {   
      Thrd.operation(1);   
   } 
}
class Thrd2 extends Thread {
   // thread number 2   
   public void run() {   
      Thrd.operation(5);   
   }
}
class Thrd3 extends Thread {
   // thread number 3
   public void run() {
      Thrd.operation(10);   
   }   
}   
public class ThrdExecution {
   public static void main(String args[]) {
      // 创建线程类的对象
      Thrd1 oprt1 = new Thrd1();   
      Thrd2 oprt2 = new Thrd2();  
      Thrd3 oprt3 = new Thrd3();
      // 启动线程操作
      oprt1.start();   
      oprt2.start();  
      oprt3.start();
   }
}   

输出

1
2
3
4
10
11
12
13
5
6

我们已经讨论过,我们无法预测线程的执行顺序。在上面的输出中,第一个线程首先执行,然后是第三个,然后是第二个。每次运行代码时,我们都会得到不同的输出。

结论

在本文中,我们讨论了多线程最重要的主题之一。同步保证在给定时间只有一个线程可以执行操作,这意味着它推动线程按顺序执行代码块。


相关文章