
java 多线程同步谜团
问题呈现
在进行多线程编程时,打算合理利用线程处理耗时任务。但是,在使用如下代码时,遇到了令人困惑的问题:
import java.util.concurrent.executorservice;
import java.util.concurrent.executors;
import java.util.concurrent.timeunit;
public class multithreadtest {
private static volatile int lt_num = 0;
private static executorservice executor = executors.newfixedthreadpool(20);
public static void main(string[] args) {
for (int i = 0; i < 20; i++) {
lt_num = i;
executor.execute(() -> num(lt_num));
}
executor.shutdown();
executor.awaittermination(1, timeunit.seconds);
}
public static void num(int lt_num) {
try {
thread.sleep(1);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(num++);
}
}问题分析
原本的预期是,结果中应该包含 1 到 20 这 20 个数,顺序并不重要,但不能出现重复。然而,结果却出现随机性,甚至出现了重复的情况。
立即学习“Java免费学习笔记(深入)”;
解决建议
问题根源在于 num() 方法是非同步执行的,缺少必要的同步机制。在 main() 方法中,lt_num++ 操作没有加锁,导致多个线程可能同时修改 lt_num 变量。为了解决此问题,需要在 lt_num = i 之前加上锁,并在调用 num() 方法后释放锁。修改后的代码如下:
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
synchronized (MultiThreadTest.class) {
lt_num = i;
executor.execute(() -> num(lt_num));
}
}
}通过引入同步机制,num() 方法中的 lt_num++ 操作始终是在一个线程中独占执行,从而确保了结果的正确性。
以上就是Java 多线程同步:为什么我的代码运行结果不稳定?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号