在这种情况下,ArrayList是否会导致竞争条件或死锁?

时间:2013-10-08 23:36:05

标签: java process arraylist operating-system deadlock

我最近完成了一个操作系统课程的项目,但在项目的一个特定部分,我想知道我是否做出了最好的决定。在这个项目中,我们需要设计一个PID管理器。

PID管理器的目的是在进程首次创建时为其分配唯一的进程标识符(PID)。当进程完成执行时,PID将返回到PID管理器,因此可以将相同的PID重新分配给后续进程。没有两个进程可以分配相同的PID。

以下是我们需要实现的界面:

public interface PIDManager
{

    public static final int MIN_PID = 4;
    public static final int MAX_PID = 127;

    public int getPID();
    public int getPIDWait();
    public void releasePID(int pid);
}

因此getPID()只返回一个唯一的PID,但如果没有可用的PID,则返回-1。 getPIDWait()返回唯一的PID,但阻止调用进程直到PID可用。 releasePID()释放PID,以便它可供另一个需要使用它的进程使用。

我们需要某种类型的数据结构来跟踪分配的PID。问题描述表明,此数据结构需要没有竞争条件死锁。例如,可以将同一个PID同时分配给多个进程,这是我们不想要的。

所以我最近完成了这个项目。我选择使用ArrayList来跟踪分配的PID。我选择了一个ArrayList,因为它增大和缩小的大小提供了很多方便,可以很容易地从ArrayList中添加或删除PID,并检查PID是否包含在其中。但现在我不确定ArrayList是否会导致竞争条件或死锁。在这种情况下使用ArrayList会起作用吗?如果您愿意,我可以提供我的实施。

1 个答案:

答案 0 :(得分:3)

如果我正确地解释你的限制,那么你的PID范围是4-127,所以只要你适当地锁定,你就可以使用ArrayList

稍微更有效地使用内存将使用BitSet。你仍然需要适当的锁定。

稍微降低内存成本但性能更好,您可能会发现其中一个并发集更有效 - 也许是ConcurrentSkipListSet。然后,您不需要进行任何锁定,因为它本身就是线程安全的。有关相关主题,请参阅here