gpt4 book ai didi

java - 使用有界缓冲区(生产者/消费者)是否可以避免同步方法/死锁的痛苦?

转载 作者:行者123 更新时间:2023-12-01 15:42:29 25 4
gpt4 key购买 nike

我正在编写一个简单的银行模拟器,用户可以使用套接字同时从不同的位置登录。在银行服务器中,我保留一个有界缓冲区来存储每个传入请求,例如:转账资金、获取帐户余额等,并且在服务器端(缓冲区读取器)运行一个后台线程,以从此请求队列中提取每个请求(假设它有效)作为操作系统中的线程调度程序),以 FCFS 为基础。

我已经使缓冲区的 put() 和 get() 方法具有条件同步。

例如:

// put method
while(total_buffer_size == current_total_requests) {

System.out.println("Buffer is full");
wait();

}

所以我的问题是,我们是否必须同步方法(例如获取余额或转移资金)以避免数据损坏?我认为这是没有必要的,因为缓冲区读取器会一一处理每个请求并采取相关操作。 我是否通过此避免了任何僵局情况?你怎么认为?谢谢

编辑2:

public synchronized boolean put(Messenger msg, Thread t, Socket s) throws InterruptedException {
while(total_buffer_size == current_total_requests) {

System.out.println("Buffer is full");
wait();

}
current_total_requests++;

requests[cur_req_in] = new Request(msg, s); // insert into Queue

cur_req_in = (cur_req_in + 1) % total_buffer_size ;

notifyAll();

return true;
}

// take each incoming message in queue. FIFO rule followed
public synchronized Request get() throws InterruptedException {

while(current_total_requests==0) wait();
Request out = requests[cur_req_out];
requests[cur_req_out] = null;

cur_req_out = (cur_req_out + 1) % total_buffer_size ;
current_total_requests--;
notifyAll(); //wake all waiting threads to continue put()
return out;

}

最佳答案

如果只有一个消费者(即一个消费来自“缓冲区”的请求的线程),那么您不需要在与银行帐户相关的方法上使用任何同步。但是,我不认为您当前的“有界缓冲区”实现是有效的。更具体地说:

while(total_buffer_size == current_total_requests) {

System.out.println("Buffer is full");
wait();

}

绝对无法保证有多少线程会通过 while 循环,在 current_total_requests 递增之前执行上下文切换,并且排队的请求数量会超过缓冲区大小所允许的数量。除非您的 put 方法是同步的,否则这种方法将极其不可靠并且容易出现竞争条件。

如果您想要一个有界缓冲区,那么只需使用 Java 已经存在的“有界缓冲区”之一,或更具体地说:BlockingQueueBlockingQueueput(...) 上阻塞:

Inserts the specified element into this queue, waiting if necessary for space to become available.

如果队列中没有数据,它还会阻塞 take()。我不知道您是否可以使用并发库中的一项,但如果不能,则必须修复您的 BoundedBuffer

关于java - 使用有界缓冲区(生产者/消费者)是否可以避免同步方法/死锁的痛苦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7815867/

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