面试题答案
一键面试1. 思路分析
要测试多线程环境下 increment
方法的正确性,需要模拟多个线程同时调用该方法,并验证最终结果是否符合预期。JUnit 本身没有直接支持多线程测试的特性,但可以借助 CountDownLatch
等工具来实现。
2. 关键代码示例
import org.junit.jupiter.api.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SharedResourceTest {
@Test
public void testIncrementInMultiThread() throws InterruptedException {
int threadCount = 10;
int expectedResult = 100;
SharedResource sharedResource = new SharedResource();
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
executorService.submit(() -> {
for (int j = 0; j < 10; j++) {
sharedResource.increment();
}
latch.countDown();
});
}
latch.await();
executorService.shutdown();
assert sharedResource.getValue() == expectedResult;
}
}
class SharedResource {
private int value = 0;
public void increment() {
synchronized (this) {
value++;
}
}
public int getValue() {
return value;
}
}
3. 代码解释
- 测试方法
testIncrementInMultiThread
:- 定义了线程数量
threadCount
和预期结果expectedResult
。 - 创建
SharedResource
实例和线程池ExecutorService
。 - 使用
CountDownLatch
来同步所有线程,确保所有线程执行完毕后再进行结果验证。
- 定义了线程数量
- 线程任务:
- 每个线程循环调用
increment
方法 10 次,调用完毕后通过latch.countDown()
通知CountDownLatch
该线程已完成。
- 每个线程循环调用
- 结果验证:
- 调用
latch.await()
等待所有线程执行完毕,然后关闭线程池并验证SharedResource
的最终值是否等于预期结果。
- 调用
SharedResource
类:increment
方法使用synchronized
关键字保证线程安全,对共享变量value
进行自增操作。getValue
方法用于获取当前value
的值。