如何让两个线程轮流修改arraylist?

Dzi*_*gas 4 java multithreading arraylist

您将在下面看到的代码尝试实现以下功能:

  • 将"第0行"添加到arraylist中
  • 打印arraylist中的最后一项,即"第0行"
  • 从arraylist中删除最后一项

  • 将"第1行"添加到arraylist中

  • 打印arraylist中的最后一项,即"第1行"从arraylist中删除最后一项

......等等没有尽头.

所以,我期望的输出只是:

第0行

第1行

..

..

然而,我得到的是随机数量的"行i",其中我也是随机的.这是一个示例输出:

第0行

38919行

47726行

第54271行

然后程序陷入似乎死锁的状态,即使这没有意义,因为变量'hold'只能是true或false,并且这些情况之一应该允许其中一个线程工作.

import java.util.*;

public class Test {

     static boolean held = true;
     static ArrayList<String> line = new ArrayList<>();


     public static void main(String[] args) {

        new Thread() {
            @Override
            public void run() {
                int i = 0;
                while(true) {
                    if(held) {
                        line.add("Line " + i);
                        i++;
                        held = false;
                    }
                }
            }


        }.start();

        while(true) {
            if(!held) {
                System.out.println( line.get(line.size() - 1) );
                line.remove(line.size() - 1);
                held = true;

            }else continue;
        }

    }


}
Run Code Online (Sandbox Code Playgroud)

Tom*_*m G 6

可能你的held变量不是volatile导致死锁的事实.计算机上的不同核心将拥有自己的内存缓存,这些缓存不一定同时更新.要确保所有线程都可以看到对保持的更改,您应该使其变得不稳定.您还可以使用AtomicBoolean,或同步访问代码块.