线程同时工作
Threads working at the same time
我正在尝试将我的 class 作为队列,这样如果我有 两个线程 ,一个添加元素,另一个删除元素 - 他们可以在同时。目前一个被阻塞是因为线程正在争夺同一个锁对象。
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
等并发集合就是这样实现并发读写的。实施锁剥离并非易事。
您需要问问自己,实现带锁剥离的自定义集合是否比选择 JDK 集合(例如 ConcurrentLinkedDeque
.
更容易?
我正在尝试将我的 class 作为队列,这样如果我有 两个线程 ,一个添加元素,另一个删除元素 - 他们可以在同时。目前一个被阻塞是因为线程正在争夺同一个锁对象。
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
等并发集合就是这样实现并发读写的。实施锁剥离并非易事。
您需要问问自己,实现带锁剥离的自定义集合是否比选择 JDK 集合(例如 ConcurrentLinkedDeque
.