Java多线程同步问题及解决方案示例
在Java中,多线程同步主要通过以下几种方式实现:
synchronized关键字:
- 修饰方法:
synchronized (object) { }
- 修饰代码块:
synchronized (blockLock) { // ... }
- 修饰方法:
wait()和notify()方法:
- 当一个线程需要等待其他线程操作完成时,会调用
wait()
。 - 如果某个条件满足,就需要唤醒正在等待的线程,调用
notify()
。
- 当一个线程需要等待其他线程操作完成时,会调用
Semaphore(信号量):
- 用于控制同时访问资源的线程数量。
- 当一个线程需要获取信号量时,如果信号量大于0,则会减1并允许线程进入。
示例:
public class SynchronizedExample {
private final Object lock = new Object();
// 使用 synchronized 关键字修饰方法
public void syncMethod() {
synchronized (lock) { // 同步代码块
System.out.println("Sync Method executing..."); // 执行任务
}
}
// 使用 wait 和 notify 方法实现同步
public class WaitNotifyExample {
private final Object lock = new Object();
private boolean isRunning = true;
public void waitAndNotify() {
while (isRunning) { // 确保线程在运行期间进行操作
synchronized (lock) { // 同步代码块
if (!isRunning) { // 当不再需要运行时通知
System.out.println("Notifying..."); // 输出通知信息
lock.notify(); // 提醒等待的线程
}
}
}
}
public void test() {
new Thread(() -> syncMethod())).start();
new Thread(() -> waitAndNotify())).start();
}
}
public class Main {
public static void main(String[] args) {
SynchronizedExample example = new SynchronizedExample();
example.test(); // 测试同步操作
}
}
}
在这个示例中,SynchronizedExample
类中的方法通过synchronized
关键字进行同步。同时,还创建了另一个类WaitNotifyExample
,其中的waitAndNotify
方法使用wait
和notify
进行同步。
在main
方法中,我们创建了一个example
对象并调用其test
方法来测试多线程同步。
还没有评论,来说两句吧...