Java 多线程同步:为什么我的代码运行结果不稳定?
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 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 个数,顺序并不重要,但不能出现重复。然而,结果却出现随机性,甚至出现了重复的情况。
解决建议
问题根源在于 num() 方法是非同步执行的,缺少必要的同步机制。在 main() 方法中,lt_num++ 操作没有加锁,导致多个线程可能同时修改 lt_num 变量。为了解决此问题,需要在 lt_num = i 之前加上锁,并在调用 num() 方法后释放锁。修改后的代码如下:
public static void main(String[] args) { for (int i = 0; i num(lt_num)); } } }
通过引入同步机制,num() 方法中的 lt_num++ 操作始终是在一个线程中独占执行,从而确保了结果的正确性。
以上就是Java 多线程同步:为什么我的代码运行结果不稳定?的详细内容,更多请关注其它相关文章!