gpt4 book ai didi

java - 使用线程更新 volatile boolean 数组

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

我是一名计算机科学学生,目前正在学习并发编程,因此我对线程的了解仍然是,呃,尝试性的。

我只是有点卡在用线程更新共享数组的逻辑上。我正在创建一个程序,允许潜在无限数量的线程不断更新大小为 10 的 boolean 数组,以模拟座位区的想法,人们可以进去,坐下随机的时间,然后离开。这是我的代码:

class Viewer extends Thread{
private String name;
private int index;
volatile boolean[] seats;


Viewer(boolean[] st, String n){
seats = st;
name = n;
}

public void run() {
ViewingStand vs = new ViewingStand(seats);
this.index = vs.findSeat(name, seats);
try {
Thread.sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
seats = vs.leaveSeat(name, seats, index);

}
}

class ViewingStand{
private volatile boolean[] area; //the array used by threads
private int seatNo; //index of whatever area is being taken or left.
Random rand = new Random();
boolean found = false;

public ViewingStand(boolean st[]){
this.area = st;
}

public int findSeat(String s, boolean[] seats){
this.area = seats;
while(found == false) {
for(int i=0; i < area.length; i++) {
if(area[i] == true) {
found = true;
this.seatNo = i;
area[seatNo] = false;
System.out.println(s + " has found a seat.");
return this.seatNo;
}
}
System.out.println(s + " has started searching again.");
}
return -1; //should never reach this
}

public boolean[] leaveSeat(String s, boolean[] area, int n){
this.area = area;
this.area[n] = false;
System.out.println(s + " has left their seat.");
return this.area;
}

该程序的结果是数组最初填充了 10 个元素(我从主程序传递的数组的大小),然后这些线程留下“一个”数组,但显然与我传回的数组不同在两个 ViewingStand 方法之间来回切换,因为第 10 个之后的每个后续线程都会陷入寻找座位的困境。希望得到一些意见来为我指明正确的方向。谢谢!

最佳答案

我首先会忽略并发问题,直接解决您所询问的逻辑错误 - leaveSeat 正在设置 this.area[n] = false - 这似乎表明座位已被占用(如果值为 true,您的 findSeat 方法假定座位为空)。

关于并发问题:您可能会在循环检查席位时遇到问题 - 多个线程可能会确定席位为空(并进入 if block ),并且所有线程都“声明”同一个席位。您应该构建一个 ViewingStand 实例,并让它管理对座位的访问 - 使用 synchronized 等并发控制或锁定来确保多个线程不会修改座位的状态同时。

关于java - 使用线程更新 volatile boolean 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53439322/

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