MR_WANGCX 2019-06-14 21:51 采纳率: 100%
浏览 457
已采纳

多线程数据安全问题,为啥会爆java.util.NoSuchElementException

限制一次只能有特定数的线程进行工作,添加操作写在同步代码块外面,按理只会少删,为啥会爆java.util.NoSuchElementException,求大佬解析

public class A {
    LinkedList<Object> activeT = new LinkedList<>();
    int a = 1;

    public void done() {
        synchronized (activeT) {
            while (activeT.size() >= 2) {
                try {
                    activeT.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
//            activeT.addLast("加入" + Thread.currentThread().getName());
        }
        try {
            Thread.sleep(6);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        activeT.addLast("加入" + Thread.currentThread().getName());


        synchronized (activeT) {
            System.out.println(activeT.size());
            activeT.removeFirst();
            activeT.notifyAll();
        }


    }

    public static void main(String[] args) {
        A a = new A();
        Stream.of("A", "B", "C", "D", "E", "F", "G", "H", "K").map(name -> new Thread(() -> {
            a.done();
        }, name)).forEach(thread -> thread.start());
    }

}


  • 写回答

2条回答 默认 最新

  • MR_WANGCX 2019-06-15 13:12
    关注

    linkedlist add()没锁,多个线程同时进入add方法,然后两个都拿到了队尾的指针,后面的哪个就会覆盖前面的哪个,实际list里面的个数比list。size小,所以当里面对象被删完时,获取到的first为null抛错

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作