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