gpt4 book ai didi

java - 线程同时工作

转载 作者:行者123 更新时间:2023-11-30 11:04:38 25 4
gpt4 key购买 nike

我正在尝试将我的类设置为队列,这样如果我有两个线程,一个添加元素,另一个删除元素 - 它们可以同时>。目前一个被阻塞是因为线程正在争夺同一个锁对象。

public class Queue {

private Cell head, tail;

public synchronized void add(Object o){
Cell c = new Cell(o);
if (tail == null) { head = c; }
else { tail.next = c; }
c.next = null;
tail = c;
notifyAll();
}

public synchronized Object remove()
throws InterruptedException {
while (head == null){
wait();
}
Cell c = head;
head = head.next;
if (head == null){ tail = null; };
return c.contents;
}
}

class Cell {
Cell next;
Object contents;
public Cell(Object o) { contents = o; }
}

主要:

public static void main(String[] args) throws InterruptedException {

Queue q = new Queue();

Thread thr = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 1000; i++)
q.add(new Integer(i));
}

});
Thread thr1 = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 10000; i++)
try {
q.remove();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

});

thr.start();
thr1.start();

}

最佳答案

标准同步技术无法实现您的要求。即,队列的并发更新。这是因为当一个线程获取队列锁时,另一个线程无法获取队列锁,因此无法继续。

为了实现对队列的并发更新,您必须实现的技术称为锁剥离ConcurrentHashMap 等并发集合就是这样实现并发读写的。实现锁剥离并非易事。

您需要问问自己,使用锁剥离实现自定义集合是否比选择 ConcurrentLinkedDeque 等 JDK 集合更容易。

关于java - 线程同时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29964555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com