限制一次只能有特定数的线程进行工作,添加操作写在同步代码块外面,按理只会少删,为啥会爆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());
}
}
linkedlist add()没锁,多个线程同时进入add方法,然后两个都拿到了队尾的指针,后面的哪个就会覆盖前面的哪个,实际list里面的个数比list。size小,所以当里面对象被删完时,获取到的first为null抛错
List<Object> activeT = java.util.Collections.synchronizedList(new LinkedList<Object>());
因为add remove都不是原子操作,可能执行一半的时候被中断,此时list的状态不确定