读者编写问题并发Java

Fer*_*uzz 2 java concurrency readerwriterlock

这是读者作者的实现,即许多读者可以阅读但只有一个作家可以在任何时候写.这是否按预期工作?

public class ReadersWriters extends Thread{

static int num_readers = 0;
static int writing = 0;

public void read_start() throws InterruptedException {         

    synchronized(this.getClass()) {
        while(writing == 1) wait();
        num_readers++;
    }        
}

public void read_end() {
    synchronized(this.getClass()) {
        if(--num_readers == 0) notifyAll();
    }
}

public void write_start() throws InterruptedException{

    synchronized(this.getClass()) {
        while(num_readers > 0) wait();
        writing = 1;
    } 
}

public void write_end() {
    this.getClass().notifyAll();
}
}
Run Code Online (Sandbox Code Playgroud)

此实现也与声明每个方法有任何不同

public static synchronized read_start() 
Run Code Online (Sandbox Code Playgroud)

例如?

谢谢

Jon*_*eet 6

不 - 你是隐式调用this.wait(),尽管没有同步this,而是在课堂上.同样,你要调用this.notifyAll()read_end.我的建议:

  • 不要扩展Thread- 你根本就没有专门的线程.
  • 不要从实例成员中使用这样的静态变量; 它使它看起来像每个对象的状态,但实际上没有.就个人而言,我只是使用实例变量.
  • 不要在名称中使用下划线 - 传统的Java名称将是numReaders,readEnd(或更好endRead),等等.
  • this如果可以提供帮助,请不要在任何一个或类上同步.我个人更喜欢有一个private final Object变量来锁定(等待等).这样您就知道只有您的代码可以在其上进行同步,这使得更容易推理.
  • 你永远不会设置writing为0.首先使用整数而不是a的任何理由boolean

当然,如果可能的话,最好在框架中使用这个类 - 但我希望你真的写这个来更好地理解线程.