Java 读者-作者问题-读者和作者的公平问题

Java 读者-作者问题-读者和作者的公平问题,java,multithreading,concurrency,conditional-statements,locking,Java,Multithreading,Concurrency,Conditional Statements,Locking,我的任务是用java编写一个Readers-Writer程序,在本例中,它对java中的读者和作者都是公平的。在前两次运行中,程序运行正常,但当我运行了30个读卡器和3个写卡器时,程序停止运行。我不知道是什么原因。。。我创建了两个ReaderThread和WriterThread对象列表,并在一个main方法(此处不包括)中启动它们,然后通过这两个列表使用join(),这样创建的线程就不会出错。迄今为止的守则: public class ReaderWriter { static Loc

我的任务是用java编写一个Readers-Writer程序,在本例中,它对java中的读者和作者都是公平的。在前两次运行中,程序运行正常,但当我运行了30个读卡器和3个写卡器时,程序停止运行。我不知道是什么原因。。。我创建了两个
ReaderThread
WriterThread
对象列表,并在一个main方法(此处不包括)中启动它们,然后通过这两个列表使用
join()
,这样创建的线程就不会出错。迄今为止的守则:

public class ReaderWriter {
    static Lock lock = new ReentrantLock();
    static Lock queue = new ReentrantLock();
       static Condition read  = lock.newCondition(); 
       static Condition write = lock.newCondition(); 
    static AtomicInteger readWait = new AtomicInteger(0);
    static AtomicInteger readActive = new AtomicInteger(0);
    static AtomicInteger writeWait= new AtomicInteger(0);
    static AtomicInteger writeActive = new AtomicInteger(0);
    static StringBuilder str = new StringBuilder();
    static int val = 0;
    static class ReaderThread extends Thread {
        @Override
        public void run() {
            try {
                queue.lock();
                lock.lock();
                
                while (writeWait.get() > 0 ) 
                    read.await();
                readWait.getAndIncrement();
                read.signal();
                queue.unlock();
                lock.unlock();
                
                System.out.println("Thread: " + Thread.currentThread().getId() + " is reading a string: " + str);
                Thread.sleep(1500);
                System.out.println("Thread: " + Thread.currentThread().getId() + " has stopped reading");
                lock.lock();
                readWait.getAndDecrement();
                if (readWait.getAndDecrement() ==  0 ) {
                    write.signal();
                } 
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

    static class WriterThread extends Thread {
        @Override
        public void run() {
            try {
                queue.lock();
                lock.lock();
                
                while(readWait.get() > 0 ||  writeWait.get() > 0)   
                    write.await();
                writeWait.getAndIncrement();
                
                queue.unlock();
                lock.unlock();
                
                System.out.println("Thread: " + Thread.currentThread().getId() + " is writing");
                str.append(val);
                val++;
                Thread.sleep(2000);
                System.out.println("Thread: " + Thread.currentThread().getId() + " has stopped writing");
                lock.lock();
                writeWait.getAndDecrement();
            
                    if(writeWait.get() == 0) {
                        read.signal();
                    } else {
                        write.signal();
                    }
            
                lock.unlock();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
我从运行包含20个读卡器和2个写卡器的程序中得到的输出如下所示,它冻结在那里:

Thread: 13 is writing
Thread: 13 has stopped writing
Thread: 14 is reading a string: 0
Thread: 16 is reading a string: 0
Thread: 14 has stopped reading
Thread: 16 has stopped reading
然而,有时prgram只起作用,输出如下(20个读卡器和2个写卡器):


但通常情况下,这个项目还没有结束。我真的不确定这可能来自哪里,任何建议都将不胜感激

有没有可能在Linux上?类似的事情,涉及工作既没有完成也没有退出的线程。由于CPU_处理内部阵列的线程数(无/IO、无同步、无死锁),事情开始得很好,然后3个线程耗尽了其他线程的CPU,然后2个线程占主导地位,当它们完成时,就像程序忘记了其他线程一样。我可以在系统监视器上看到一切都是静止的

**更新** 让我的UncaughtExceptionHandler打印一些东西到输出,瞧,这里缺少了线程。程序没有停止,因为缺少的线程没有对int值线程进行倒计时。退出前,main会进行检查。给你的线程分配一个UncaughtExceptionHandler并吐出一些东西;也许它会提供信息

谢天谢地,程序员出错了。希望你也有同样的运气

更新2由OutOfMemoryError/堆空间导致的异常

Thread: 13 is writing
Thread: 13 has stopped writing
Thread: 14 is reading a string: 0
Thread: 14 has stopped reading
Thread: 12 is writing
Thread: 12 has stopped writing
Thread: 16 is reading a string: 01
Thread: 18 is reading a string: 01
Thread: 17 is reading a string: 01
Thread: 15 is reading a string: 01
Thread: 20 is reading a string: 01
Thread: 21 is reading a string: 01
Thread: 19 is reading a string: 01
Thread: 23 is reading a string: 01
Thread: 22 is reading a string: 01
Thread: 25 is reading a string: 01
Thread: 26 is reading a string: 01
Thread: 27 is reading a string: 01
Thread: 24 is reading a string: 01
Thread: 30 is reading a string: 01
Thread: 31 is reading a string: 01
Thread: 29 is reading a string: 01
Thread: 28 is reading a string: 01
Thread: 33 is reading a string: 01
Thread: 32 is reading a string: 01
Thread: 28 has stopped reading
Thread: 29 has stopped reading
Thread: 18 has stopped reading
Thread: 17 has stopped reading
Thread: 21 has stopped reading
Thread: 19 has stopped reading
Thread: 23 has stopped reading
Thread: 24 has stopped reading
Thread: 27 has stopped reading
Thread: 33 has stopped reading
Thread: 26 has stopped reading
Thread: 32 has stopped reading
Thread: 16 has stopped reading
Thread: 22 has stopped reading
Thread: 25 has stopped reading
Thread: 20 has stopped reading
Thread: 15 has stopped reading
Thread: 30 has stopped reading
Thread: 31 has stopped reading