在Java中,线程是并发编程的基础,而线程之间的同步与等待机制则是确保程序正确执行的关键。本文将深入探讨Java中的同步与等待机制,并介绍如何通过这些机制实现线程按顺序执行,从而解锁高效并发编程的技巧。
一、同步机制
同步机制是Java中用于控制多个线程对共享资源访问的一种方式。Java提供了以下几种同步机制:
1. 锁(synchronized)
在Java中,synchronized关键字可以用于同步方法或代码块。当一个线程进入一个synchronized方法或代码块时,它会获取该对象的监视器锁,直到方法或代码块执行完毕。
public class SynchronizedExample {
public synchronized void synchronizedMethod() {
// 方法体
}
}
2. 重入锁(ReentrantLock)
ReentrantLock是Java 5引入的一个更高级的同步机制,它提供了比synchronized更灵活的锁定策略。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private final Lock lock = new ReentrantLock();
public void lockedMethod() {
lock.lock();
try {
// 方法体
} finally {
lock.unlock();
}
}
}
二、等待与通知机制
等待与通知机制用于线程之间的协作。当一个线程需要等待某个条件成立时,它可以使用wait()方法挂起自己,直到其他线程调用notify()或notifyAll()方法唤醒它。
1. wait()
wait()方法使得当前线程等待,直到另一个线程调用notify()或notifyAll()方法。在调用wait()方法时,当前线程会释放锁。
public class WaitExample {
public void waitMethod() throws InterruptedException {
synchronized (this) {
wait();
}
}
}
2. notify()
notify()方法唤醒等待在该对象监视器上的一个线程。如果多个线程在该对象上等待,则任意选择一个线程唤醒。
public class NotifyExample {
public void notifyMethod() {
synchronized (this) {
notify();
}
}
}
3. notifyAll()
notifyAll()方法唤醒在该对象监视器上等待的所有线程。
public class NotifyAllExample {
public void notifyAllMethod() {
synchronized (this) {
notifyAll();
}
}
}
三、按顺序执行线程
要实现线程按顺序执行,可以通过以下方法:
- 使用共享资源(如锁)来控制线程执行顺序。
- 使用等待与通知机制实现线程之间的协作。
以下是一个示例,展示了如何使用同步与等待机制实现线程按顺序执行:
public class OrderlyExecutionExample {
private final Lock lock = new ReentrantLock();
private int count = 0;
public void thread1() throws InterruptedException {
lock.lock();
try {
while (count < 5) {
count++;
System.out.println("Thread 1: " + count);
if (count < 5) {
lock.unlock();
count--;
Thread.sleep(100);
lock.lock();
}
}
} finally {
lock.unlock();
}
}
public void thread2() throws InterruptedException {
lock.lock();
try {
while (count < 5) {
System.out.println("Thread 2: " + count);
count++;
if (count < 5) {
lock.unlock();
count--;
Thread.sleep(100);
lock.lock();
}
}
} finally {
lock.unlock();
}
}
}
在上述示例中,线程1和线程2通过共享资源(锁)和等待与通知机制实现了按顺序执行。
四、总结
通过深入了解Java中的同步与等待机制,我们可以更好地控制线程的执行顺序,从而实现高效并发编程。在实际应用中,根据需求选择合适的同步机制和协作方式,可以有效提升程序的性能和稳定性。
