java处理并发时,synchronized语句块中,无论使用对象监视器的wait notify/notifyAll还是Condition的await signal/ signalAll方法调用,我们首先都会对共享数据的临界值进行判断,当条件满足或者不满足的时候才会调用相关方法使得当前线程挂起,或者唤醒wait的线程。
1. wait/notify示例代码
package org.example.model.guava;
import lombok.SneakyThrows;
import org.junit.Test;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;
public class MonitorTest {
// queue既是队列又是并发监视器
private LinkedList<Long> queue = new LinkedList<>();
private int maxSize = 2;
@Test
public void test() {
AtomicLong count = new AtomicLong(0);
// 起三个线程向队列添加元素
IntStream.range(0, 3).forEach(i ->
new Thread(() -> {
while (true) {
long value = count.getAndIncrement();
offer(value);
System.out.println("offer--" + i + ":" + value);
sleep(1);
}
}).start());
// 起三个线程从队列中取元素
IntStream.range(0, 3).forEach(i ->
new Thread(() -> {
while (true) {
long value = take();
System.out.println("take---" + i + ":" + value);
sleep(1);

文章介绍了在Java中处理并发时,如何使用synchronized关键字配合wait/notify以及Condition的await/signal方法来控制线程同步。同时对比了GuavaMonitor的使用,强调其能提高代码的可读性和语义性。示例代码展示了如何实现一个线程安全的队列,当队列满或空时,线程会根据条件自动等待或唤醒。
最低0.47元/天 解锁文章
1322

被折叠的 条评论
为什么被折叠?



