假设我有以下列表:
List<MyObject> myObjectsList = new ArrayList<>();
如果我做这样的事情:
synchronized(myObjectsList )
{
//some code runs here...
}
是否意味着列表中的每个对象都是线程安全的,或者如果某个其他线程对列表中的某些对象有引用可以修改它?
答案 0 :(得分:4)
...或者如果某个其他线程引用了一些内部对象 列表可以修改吗?
是的,他们可以修改对象,因为他们可以锁定MyObject
个实例。
答案 1 :(得分:0)
synchronized(myObjectsList )
{
//some code runs here...
}
此代码的作用仅是获取列表中的唯一锁。这就是它所做的一切。因此,这不会阻止其他代码在您的列表中执行任何操作。从字面上看,一切都可以完成。但是,当您的其他并发代码也尝试获取锁定时(即:它也被同一synchronized
上的myObjectsList
语句包围),它将阻塞,直到锁被释放为止拥有锁的synchronized
块。