在Java编程中,线程同步是一个重要的概念,它确保了多个线程在访问共享资源时的一致性和完整性。本文将通过一个简单的示例程序来解释线程同步的概念,特别是如何使用对象锁来实现同步。
在Java中,每个对象都有一个与之关联的锁。当一个线程需要访问某个对象的同步代码块或同步方法时,它必须先获取该对象的锁。如果锁已经被其他线程持有,则该线程将被阻塞,直到锁被释放。这种机制确保了一次只有一个线程能够执行同步代码块或方法,从而避免了并发访问共享资源时可能出现的问题。
以下是一个使用对象锁进行线程同步的示例程序。在这个程序中,创建了一个名为processor
的类,它实现了Runnable
接口。这个类有一个名为objectLock
的成员变量,用于在运行时锁定同步代码块。
class Processor implements Runnable {
Object objectLock;
public Processor() {
objectLock = new Object();
}
public void run() {
display();
}
public void display() {
synchronized (objectLock) {
for (int i = 0; i <= 5; i++) {
System.out.println("i = " + i + " In thread" + Thread.currentThread());
}
}
}
}
在主类Locks
中,创建了一个Processor
对象,并基于这个对象创建了两个线程t1
和t2
。这两个线程共享同一个objectLock
,因此它们将按照对象锁的规则进行同步。
class Locks {
public static void main(String[] args) {
Processor p1 = new Processor();
Thread t1 = new Thread(p1, "t1");
Thread t2 = new Thread(p1, "t2");
t1.start();
t2.start();
}
}
程序的输出如下,展示了两个线程如何依次执行同步代码块:
i = 0 In threadThread[t1, 5, main]
i = 1 In threadThread[t1, 5, main]
i = 2 In threadThread[t1, 5, main]
i = 3 In threadThread[t1, 5, main]
i = 4 In threadThread[t1, 5, main]
i = 5 In threadThread[t1, 5, main]
i = 0 In threadThread[t2, 5, main]
i = 1 In threadThread[t2, 5, main]
i = 2 In threadThread[t2, 5, main]
i = 3 In threadThread[t2, 5, main]
i = 4 In threadThread[t2, 5, main]
i = 5 In threadThread[t2, 5, main]
通过这个示例,可以看到对象锁如何确保依赖于同一对象的所有线程同步。在本例中,objectLock
属于p1
对象,而所有线程(即t1
和t2
)都是基于p1
创建的。