Java 同步列表vs同步列表中的对象

Java 同步列表vs同步列表中的对象,java,synchronization,thread-safety,Java,Synchronization,Thread Safety,假设我有以下列表: List<MyObject> myObjectsList = new ArrayList<>(); 这是否意味着列表中的每个对象都是线程安全的,或者如果其他线程引用了列表中的某些对象,则可以修改它 。。。或者如果其他线程引用了其中的一些对象 列表可以修改吗 是的,他们可以修改对象,因为他们可以获得对MyObject实例的锁定 synchronized(myObjectsList ) { //some code runs here... } 。。

假设我有以下列表:

List<MyObject> myObjectsList = new ArrayList<>();
这是否意味着列表中的每个对象都是线程安全的,或者如果其他线程引用了列表中的某些对象,则可以修改它

。。。或者如果其他线程引用了其中的一些对象 列表可以修改吗

是的,他们可以修改对象,因为他们可以获得对
MyObject
实例的锁定

synchronized(myObjectsList )
{
  //some code runs here...
}
。。。或者如果其他线程引用了其中的一些对象 列表可以修改吗

是的,他们可以修改对象,因为他们可以获得对
MyObject
实例的锁定

synchronized(myObjectsList )
{
  //some code runs here...
}
此代码所做的只是获取列表上的唯一锁。这就是它所做的一切。因此,这不会阻止其他代码执行列表中的任何操作。事实上,一切都可以做到。但是,当您的其他并发代码也试图获取锁时(即:它也被同一
myObjectsList
上的
synchronized
语句包围),它将阻塞,直到拥有锁的
synchronized
块释放锁为止


此代码所做的只是获取列表上的唯一锁。这就是它所做的一切。因此,这不会阻止其他代码执行列表中的任何操作。事实上,一切都可以做到。但是,当您的其他并发代码也试图获取它的锁时(即:它也被同一
myObjectsList
上的
synchronized
语句包围),它将一直阻止,直到锁被拥有锁的
synchronized
块释放。

因此,如果我希望列表中的对象是线程安全的,我需要在遍历列表和处理对象时锁定其中的每一个对象,对吗?@JoroSeksa如果您确保只能通过arraylist.get()获取对象,那么您的帖子中的代码就可以了。有三种可能性:(1)如果列表中包含的对象本质上是线程安全的(例如不可变的),那么您就可以了。(2) 为列表中的每个对象设置单独的锁(例如,在访问对象时同步对象本身)(3)在访问此类对象时使用全局锁(例如,即使访问以前从列表中获取的引用,也始终同步列表)。10x@Pyranja。这就是我所寻找的:)因此,如果我希望列表中的对象是线程安全的,我需要在遍历列表和处理对象时锁定它们中的每一个,对吗?@JoroSeksa如果您确保只能通过arraylist.get()获取对象,那么您文章中的代码就可以了。三种可能性:(1)如果列表中包含的对象本质上是线程安全的(例如不可变的),则可以。(2) 为列表中的每个对象设置单独的锁(例如,在访问对象时同步对象本身)(3)在访问此类对象时使用全局锁(例如,即使访问以前从列表中获取的引用,也始终同步列表)。10x@Pyranja。这就是我想要的:)