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

Java 在这种情况下,ArrayList会导致竞争条件或死锁吗?,java,process,arraylist,operating-system,deadlock,Java,Process,Arraylist,Operating System,Deadlock,我最近完成了一个操作系统课程的项目,但在项目的一个特定部分,我想知道我是否做出了最好的决定。在这个项目中,我们需要设计一个PID管理器 PID管理器的作用是在首次创建流程时为其分配唯一的流程标识符(PID)。当流程完成执行时,PID将返回给PID管理器,以便将相同的PID重新分配给以后的流程。不能为两个进程分配相同的PID 以下是我们需要实现的接口: public interface PIDManager { public static final int MIN_PID = 4;

我最近完成了一个操作系统课程的项目,但在项目的一个特定部分,我想知道我是否做出了最好的决定。在这个项目中,我们需要设计一个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有效吗?如果您愿意,我可以提供我的实现

如果我正确解释了您的限制,那么您的PID范围是4-127,因此在性能方面,您可以使用
ArrayList
,只要您正确锁定

使用
位集
会稍微提高内存的使用效率。您仍然需要适当的锁定


您可能会发现其中一个并发集效率更高—可能是
ConcurrentSkipListSet
,但内存开销较小,但性能更好。这样就不需要执行任何锁定,因为它本质上是线程安全的。请参阅以获取相关线程。

如果我正确解释了您的限制,那么您的PID范围为4-127,因此在性能方面,您可以使用
阵列列表
,只要您正确锁定

使用
位集
会稍微提高内存的使用效率。您仍然需要适当的锁定


您可能会发现其中一个并发集效率更高—可能是
ConcurrentSkipListSet
,但内存开销较小,但性能更好。这样就不需要执行任何锁定,因为它本质上是线程安全的。请参阅以获取相关线程。

如果我正确解释了您的限制,那么您的PID范围为4-127,因此在性能方面,您可以使用
阵列列表
,只要您正确锁定

使用
位集
会稍微提高内存的使用效率。您仍然需要适当的锁定


您可能会发现其中一个并发集效率更高—可能是
ConcurrentSkipListSet
,但内存开销较小,但性能更好。这样就不需要执行任何锁定,因为它本质上是线程安全的。请参阅以获取相关线程。

如果我正确解释了您的限制,那么您的PID范围为4-127,因此在性能方面,您可以使用
阵列列表
,只要您正确锁定

使用
位集
会稍微提高内存的使用效率。您仍然需要适当的锁定


您可能会发现其中一个并发集效率更高—可能是
ConcurrentSkipListSet
,但内存开销较小,但性能更好。这样就不需要执行任何锁定,因为它本质上是线程安全的。请参阅以获取相关线程。

如果您应用了适当的同步/锁定,则可以。如果你没有,那就不是;)哦,添加同步/锁定可能会有所帮助。。。考虑到这是本章的重点,我真不敢相信我没有想到这一点。谢谢。请参阅SO post。这是来自
ArrayList
javadoc的:“请注意,此实现是不同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。”感谢帮助人员!如果应用了适当的同步/锁定,则可以。如果你没有,那就不是;)哦,添加同步/锁定可能会有所帮助。。。考虑到这是本章的重点,我真不敢相信我没有想到这一点。谢谢。请参阅SO post。这是来自
ArrayList
javadoc的:“请注意,此实现是不同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。”感谢帮助人员!如果应用了适当的同步/锁定,则可以。如果你没有,那就不是;)哦,添加同步/锁定可能会有所帮助。。。考虑到这是本章的重点,我真不敢相信我没有想到这一点。谢谢。请参阅SO post。这是来自
ArrayList
javadoc的:“请注意,此实现是不同步的。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。”感谢帮助人员!如果应用了适当的同步/锁定,则可以。如果你没有,那就不是;)哦,添加同步/锁定可能会有所帮助。。。考虑到这是本章的重点,我真不敢相信我没有想到这一点。谢谢