gpt4 book ai didi

java - 同步循环队列

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:42 27 4
gpt4 key购买 nike

我正在实现一个非常简单的同步Circular Queue,如下所示,我的一个 friend 说它很容易出现死锁!但我不这么认为,

实际上,如果队列为空,当一个线程想要出队(轮询)时,它必须等到另一个线程入队(提供)一个元素,反之亦然,如果队列已满,

我不是很会找容易死锁的代码,你觉得它也很容易死锁吗?

import java.util.ArrayList;

class CircularQueue<T>{
ArrayList<T> q;
int front , rear , size;
public CircularQueue(int size){
q = new ArrayList<T>();
for (int i = 0 ; i < size ; i++)
q.add(null);
front = 0;
rear =0;
this.size = size;
}
public void offer(T t) throws InterruptedException{
synchronized(this){
if ( (rear + 1) % size == front)
this.wait();
}
rear = (rear + 1) % size;
q.set(rear, t);
this.notify();
}
public T poll() throws InterruptedException{
synchronized(this){
if (rear == front)
this.wait();
}
front = (front+1) % size;
T result = q.get(front);
this.notify();
return result;
}
}

最佳答案

您的实现存在几个问题:

  • 来电notify()必须来自内部 synchronized阻止
  • 您的实现会产生“逗留者”——一种 Java 内存泄漏,当对象被阻止收集的时间超过应有的时间时。要解决此问题,请设置从 poll() 返回的元素至 null .
  • 您不需要使用 ArrayList<T>并填写 null ; Object 的普通数组就足够了。您需要添加转换,但不管有没有 ArrayList,它都会在那里,所以您不妨将它移到您的代码中。
  • You should not synchronize on this .

这最后一点允许队列的恶意用户通过同步队列对象本身而不是释放锁来永久拖延进度。

关于java - 同步循环队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240025/

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