0

new に類似した単純なフェア ロックを作成する方法は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();
        }
    }
}

Custom not fair Lock (それが正しいかどうかはわかりません)

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();
        }
    }
}
4

1 に答える 1

1

公平なロックが必要な場合は、リストを使用し、リストの順序に従ってスレッドに通知する必要があります。

于 2012-04-04T10:48:05.927 に答える