gpt4 book ai didi

java - Java 读者作者并发问题

转载 作者:行者123 更新时间:2023-12-02 11:12:14 25 4
gpt4 key购买 nike

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

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

此实现与声明每个方法有什么不同

public static synchronized read_start() 

例如?

谢谢

最佳答案

否 - 您隐式调用 this.wait(),尽管没有在 this 上同步,而是在类上同步。同样,您在 read_end 中调用 this.notifyAll()。我的建议:

  • 不要扩展线程 - 您根本没有专门化线程。
  • 不要在实例成员中使用这样的静态变量;它使得它看起来好像每个对象都有状态,但实际上并没有。就我个人而言,我只会使用实例变量。
  • 不要在名称中使用下划线 - 传统的 Java 名称将是 numReadersreadEnd(或者更好,endRead) 等
  • 不要或类上进行同步(如果可以的话)。就我个人而言,我更喜欢有一个私有(private)的最终对象变量来锁定(并等待等)。这样您就知道只有您的代码可以在其上同步,这使得推理变得更容易。
  • 您从未将 writing 设置为 0。有什么理由首先使用整数而不是 boolean 吗?

当然,如果可能的话,最好使用框架中的类 - 但我希望您真正编写此内容是为了更好地理解线程。

关于java - Java 读者作者并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6089901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com