对象锁在多线程同步中的应用

多线程编程中,同步是一个关键概念,它确保了在并发执行的多个线程之间共享资源的一致性和完整性。Java提供了多种同步机制,其中之一就是对象锁。对象锁可以同步属于同一类的不同对象创建的线程,例如,线程 t1 和 t2 分别由对象 p1 和 p2 创建,并且它们都属于 processor 类。本文将探讨如何使用对象锁来同步两个不同类的对象创建的线程,例如,线程 t1 和 t2 分别由 processor 类的对象 p1 和 memory 类的对象 m1 创建。

为了演示这一点,定义了两个不同的类:processor 类和 memory 类。以下是一个示例程序:

public class Processor implements Runnable { Object objLock; public Processor(Object objLock) { this.objLock = objLock; } public void run() { executeInstructions(); } public void executeInstructions() { synchronized (objLock) { for (int i = 0; i <= 5; i++) { System.out.println("i = " + i + " In thread executeInstructions of Processor class" + Thread.currentThread()); } } } } public class Memory implements Runnable { Object objLock; public Memory(Object objLock) { this.objLock = objLock; } public void run() { checkMemory(); } public void checkMemory() { synchronized (objLock) { for (int i = 0; i <= 5; i++) { System.out.println("i = " + i + " In thread checkMemory of Memory class" + Thread.currentThread()); } } } } public class Locks { public static void main(String[] args) { Object objLock = new Object(); Processor p1 = new Processor(objLock); Memory m1 = new Memory(objLock); Thread t1 = new Thread(p1, "t1"); Thread t2 = new Thread(m1, "t2"); t1.start(); t2.start(); } }

程序的输出如下:

i = 0 In thread executeInstructions of Processor classThread[t1, 5, main] i = 1 In thread executeInstructions of Processor classThread[t1, 5, main] i = 2 In thread executeInstructions of Processor classThread[t1, 5, main] i = 3 In thread executeInstructions of Processor classThread[t1, 5, main] i = 4 In thread executeInstructions of Processor classThread[t1, 5, main] i = 5 In thread executeInstructions of Processor classThread[t1, 5, main] i = 0 In thread checkMemory of Memory classThread[t2, 5, main] i = 1 In thread checkMemory of Memory classThread[t2, 5, main] i = 2 In thread checkMemory of Memory classThread[t2, 5, main] i = 3 In thread checkMemory of Memory classThread[t2, 5, main] i = 4 In thread checkMemory of Memory classThread[t2, 5, main] i = 5 In thread checkMemory of Memory classThread[t2, 5, main]

上述程序成功编译并运行,产生了预期的输出。如上所述,有两个类:processor 类和 memory 类。这两个类都实现了 Runnable 接口,这意味着将从这两个类创建线程。processor 类从 run 方法调用 executeInstruction(),而 memory 类从 run 方法调用 checkMemory()。executeInstruction() 和 checkMemory() 方法都包含一个同步块,它们都同步在一个唯一的 objLock 对象上,因为这是在创建 memory 对象 m1 和 processor 对象 p1 时通过构造函数传递给每个对象的对象。

创建了线程 t1,它来自 processor 类的对象 p1,以及线程 t2,它来自 memory 类的对象 m1。接下来,t1 和 t2 被启动。当 t1 获得时间片时,它获取了 objLock 的锁并开始执行 executeInstructions() 中的 for 循环。由于 t1 拥有 objLock 的锁,t2 必须等待 t1 释放锁。一旦 t1 完成 for 循环的执行,它释放了 objLock。现在 t2 接管并完成执行。

通过这种方式,能够同步 t1 和 t2 这两个线程,它们分别由两个不同的对象 p1 和 m1 创建,这些对象分别属于完全不同的类 processor 和 memory。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485