多线程加减交替运算结果错误:如何确保线程访问资源的顺序?
多线程实现加减交替运算,结果与预期不符
这个问题源于在多线程环境下的同步问题。在给定的代码片段中,存在多个线程并发操作共享资源(num 变量),但未采取适当的同步措施。
具体来说,在 resource 类中,add 和 sub 方法均使用了同步块,并在需要时使用 wait 和 notifyall 进行线程通信。然而,该代码有一个关键缺陷:它没有控制线程进入方法的顺序。
这会导致线程在错误的时刻进入方法,并导致不一致的状态。例如,减法线程可能会在加法线程尚未完成之前执行,导致负数结果。
要解决此问题,需要确保线程以预期的顺序访问资源。一种方法是使用条件变量,该变量可以阻止线程进入特定的方法,直到满足特定条件(例如,当前正在执行加法操作)。通过这种方式,可以强制加法和减法操作按顺序进行,从而避免不一致的状态。
修改后的代码可能会如下所示:
class Resource { private int num = 0; private boolean flag = true; private final Condition condition = new Object(); // 引入条件变量 public synchronized void add() throws InterruptedException { while (!flag) { condition.await(); } Thread.sleep(100); num++; System.out.println("[加法操作-" + Thread.currentThread().getName() + "]num = " + num + " " + flag); flag = false; condition.signalAll(); } public synchronized void sub() throws InterruptedException { while (flag) { condition.await(); } Thread.sleep(200); num--; System.out.println("[减法操作-" + Thread.currentThread().getName() + "]num = " + num + " " + flag); flag = true; condition.signalAll(); } }
通过使用条件变量,线程可以等待直到满足特定条件才能继续执行,从而确保加法和减法操作按预期顺序进行。
以上就是多线程加减交替运算结果错误:如何确保线程访问资源的顺序?的详细内容,更多请关注www.sxiaw.com其它相关文章!