如何写一个简单的公平锁?

时间:2012-04-04 09:52:19

标签: java multithreading

如何将简单的公平锁模拟写入新的ReentrantLock(true)

     public class Main1 {

    public static void main(String[] args) {
//      Lock lock = new ReentrantLock(true);
        CustomLock lock = new CustomLock();
        new Thread(new Producer(lock)).start();
        new Thread(new Consumer(lock)).start();
    }
}

class Producer implements Runnable {
    private Lock lock;
    private CustomLock customLock;

    public Producer(Lock lock) {
        this.lock = lock;
    }

    public Producer(CustomLock lock) {
        this.customLock = lock;
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
//          lock.lock();
            customLock.lock();
            System.out.println("Producer before");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Producer after");
//          lock.unlock();
            customLock.unlock();
        }
    }
}

class Consumer implements Runnable {
    private Lock lock;
    private CustomLock customLock;

    public Consumer(Lock lock) {
        this.lock = lock;
    }

    public Consumer(CustomLock lock) {
        this.customLock = lock;
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
//          lock.lock();
            customLock.lock();
            System.out.println("Consumer before");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Consumer after");
//          lock.unlock();
            customLock.unlock();
        }
    }
}

class CustomLock{
    private boolean isLocked;

    public synchronized void lock(){
        while (isLocked) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        isLocked = true;
    }

    public synchronized void unlock(){
        if(isLocked){
            isLocked = false;
            notify();
        }
    }
}

自定义不公平锁定(我不确定它是否正确)

class CustomLock{
    private boolean isLocked;

    public synchronized void lock(){
        while (isLocked) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        isLocked = true;
    }

    public synchronized void unlock(){
        if(isLocked){
            isLocked = false;
            notify();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您想要公平锁定,则需要使用列表并按照列表顺序通知线程。