如果实例的方法是同步的,那么线程的执行就会变成每个实例一个线程的执行,但是当同一个类的实例有多个时,就会出现一个问题,需要在类级别进行同步,以便只提供类的所有实例的一个锁,而不是在对象级别进行同步,这在 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中文网其他相关文章!