Java 中的信号量列表和并发性
List of Semaphores in Java and concurrency
我有一个应用程序,在我的实现中我需要一些信号量。我的问题是这如何与 ArrayList 一起使用?
假设我有一个包含许多信号量的 ArrayList<Semaphore> semList;
,如果我这样做 semList.get(0).aquire();信号量是否会在列表中相应地更新 - 换句话说,其他线程是否知道它已被获取?我不确定,因为 ArrayList.get() 仅获取对该对象的引用。
“信号量会在列表中相应地更新吗”?
这样想:信号量不在列表中,列表只存储对信号量的引用。如果另一个线程调用 get(0)
,它将获得对同一个信号量的引用(除非列表已被修改,或者存在数据竞争)。所以是的,其他线程会知道它已被获取。
如果您同时修改列表,那么您应该使用线程安全列表,但如果它被初始化并填充一次,然后没有更改并安全发布到其他线程,那么您可以使用 ArrayList。
我建议阅读关于内存模型的 JLS 部分以帮助更好地理解它:https://docs.oracle.com/javase/specs/jls/se14/html/jls-17.html#jls-17.4.5
will the Semaphore be updated accordingly in the list
是的,直接引用信号量还是通过 list.get(0) 引用信号量并不重要。所有线程访问同一个实例。假设信号量还剩一个许可,下一个调用 acquire 方法的线程将获得最后一个许可。下一个线程将等待直到许可被释放。
我有一个应用程序,在我的实现中我需要一些信号量。我的问题是这如何与 ArrayList 一起使用?
假设我有一个包含许多信号量的 ArrayList<Semaphore> semList;
,如果我这样做 semList.get(0).aquire();信号量是否会在列表中相应地更新 - 换句话说,其他线程是否知道它已被获取?我不确定,因为 ArrayList.get() 仅获取对该对象的引用。
“信号量会在列表中相应地更新吗”?
这样想:信号量不在列表中,列表只存储对信号量的引用。如果另一个线程调用 get(0)
,它将获得对同一个信号量的引用(除非列表已被修改,或者存在数据竞争)。所以是的,其他线程会知道它已被获取。
如果您同时修改列表,那么您应该使用线程安全列表,但如果它被初始化并填充一次,然后没有更改并安全发布到其他线程,那么您可以使用 ArrayList。
我建议阅读关于内存模型的 JLS 部分以帮助更好地理解它:https://docs.oracle.com/javase/specs/jls/se14/html/jls-17.html#jls-17.4.5
will the Semaphore be updated accordingly in the list
是的,直接引用信号量还是通过 list.get(0) 引用信号量并不重要。所有线程访问同一个实例。假设信号量还剩一个许可,下一个调用 acquire 方法的线程将获得最后一个许可。下一个线程将等待直到许可被释放。