Java 中的静态同步2025年4月8日 | 阅读 6 分钟 虽然同步方法可以确保一次只有一个线程能够访问它,但它不能保证输出顺序,如果方法的执行不是顺序的,或者如果方法本身没有明确地处理执行顺序。 ![]() 因此,为了保持同步行为,实例级别的锁是不够的;相反,我们需要一个类级别的锁,这可以通过**静态同步**来实现。 换句话说,如果您将任何静态方法设置为同步,那么锁将作用于类,而不是作用于对象。由于我们实现了类级别的锁,一次只有一个线程可以对该方法执行其操作。例如,考虑以下场景。 假设一个类有多个静态同步方法(demo1、demo2、demo3、demo4),一个线程正在访问方法demo1,那么此时其他线程无法访问其他静态同步方法。 语法 为什么需要静态同步?假设一个共享类(Table)有两个对象,分别命名为object1和object2。对于同步方法和同步块,t1和t2或t3和t4之间不可能发生干扰,因为t1和t2都引用一个具有单一锁的公共对象。 但是,t1和t3或t2和t4之间可能发生干扰,因为t1获取了一个锁,而t3获取了另一个锁。我们不希望t1和t3或t2和t4之间发生干扰。因此,静态同步解决了这个问题。 因此,当我们要确保共享资源以**线程安全的方式**访问时,可以使用静态同步。 静态同步示例示例编译并运行输出 Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Sachin Good Night: Sachin Good Night: Sachin Good Night: Sachin Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Sachin Good Night: Sachin Good Night: Sachin Good Night: Sachin 说明:在上面的程序中,定义了Print、MyThrd和Main三个类,每个类都有 Print类:子线程运行所需的代码 MyThrd类:此类的作用是扩展Thread类,并为Print类的p和String类的s赋值,并调用Print类的printMessage()方法。 Main类:它是整个程序的main类,它创建一个子线程 控制流程:我们知道程序的执行始于main方法。首先,我们创建两个子线程并将它们分配给线程的print对象,并在th2.start()语句执行后,将有三个线程(main、th1、th2),执行过程如下: 子线程th1开始执行,由于print()方法是静态同步的,线程th1获得Print类的类级别锁并开始执行printMessage()方法。如果下一个线程到来(在本例中是线程th2),则该线程必须等到前一个线程执行完毕才能获得类级别的锁。 使用匿名类进行静态同步在此示例中,我们使用匿名类来创建线程。 示例编译并运行输出 100 200 300 400 500 600 700 800 900 1000 10 20 30 40 50 60 70 80 90 100 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 1 2 3 4 5 6 7 8 9 10 类锁上的同步块该块在由.class名称.class引用的对象的锁上进行同步。Table类中的静态同步方法printTable(int n)等同于以下声明: 同步与静态同步的区别
要记住的重要事项
结论在上述讨论中,我们观察到,静态同步方法将锁定类而不是对象,它将锁定类,因为static关键字的意思是:“类而不是实例”。 synchronized关键字的意思是:一次只有一个线程可以访问该方法。 而static synchronized的意思是:一次只有一个线程可以访问该类。 Java静态同步选择题1. 如何实现类级别锁?
答案:a) 说明:当我们声明一个静态方法为同步时,锁将作用于类,而不是作用于对象。由于我们可以实现类级别的锁,因此一次只有一个线程可以对该方法执行其操作。 2. 静态同步可以应用于?
答案:b) 说明:静态同步只能应用于静态方法和静态块。 3. 有效的静态同步语法是什么?
答案:d) 说明:我们可以使用i、ii和iii语句声明一个静态同步方法。 4. 用于定义静态同步方法的关键字是哪个?
答案:c) 说明:Java提供synchronization关键字来实现同步。 5. Java中的静态同步确保什么?
答案:b) 说明:静态同步确保类级别的同步。 下一个主题Java中的死锁 |
我们请求您订阅我们的新闻通讯以获取最新更新。