线程同时工作

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.

更容易?