两个线程同时遍历一百以内的数
时间: 2024-09-12 14:03:06 浏览: 32
当两个线程同时遍历100以内的数字时,这通常涉及到并发编程中的共享资源访问。在一个简单的例子中,可能会有一个数组或者集合包含从1到100的元素,两个线程各自从数组的一端开始遍历。
以下是可能出现的情况:
1. **无锁遍历**:如果数据结构允许,可以使用无锁数据结构如`ConcurrentSkipListSet`或者原子操作(如Java的`AtomicInteger`),使得每个线程独立地读取和修改数组元素,避免同步带来的开销。
```java
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream numbers = IntStream.rangeClosed(1, 100);
// 使用Future保证线程安全并获取结果
List<Future<Integer>> futures = new ArrayList<>();
for (int i : numbers) {
futures.add(executor.submit(() -> i));
}
// 同步获取所有结果
List<Integer> results = futures.stream().map(Future::get).collect(Collectors.toList());
executor.shutdown();
```
2. **锁保护**:如果数组或其他结构不允许无锁访问,就需要使用synchronized关键字或者Lock接口来保护关键部分的代码,防止竞态条件。但是这会引入性能损耗,因为每次只有一个线程能持有锁。
```java
int[] array = new int[100];
Semaphore semaphore = new Semaphore(1); // 一个信号量用于控制线程进入临界区
new Thread(() -> {
for (int i = 0; i < 50; i++) {
semaphore.acquire(); // 获取信号
processNumber(array[i]);
semaphore.release(); // 释放信号
}
}).start();
new Thread(() -> {
for (int i = 50; i < 100; i++) {
semaphore.acquire(); // 获取信号
processNumber(array[i]);
semaphore.release(); // 释放信号
}
}).start();
```
阅读全文