在多线程编程中,同步是一个关键概念,它确保了在并发执行的多个线程之间共享资源的一致性和完整性。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。