Допустим, у меня есть следующий список:Список Синхронизировать против объекта Синхронизировать внутри списка
List<MyObject> myObjectsList = new ArrayList<>();
если я сделать что-то вроде этого:
synchronized(myObjectsList)
{
//some code runs here...
}
это означает, что каждый объект в списке является поточно безопасно или если какой-либо другой поток ссылается на некоторые из объектов внутри списка, это может изменить его?
Так что, если я хочу, чтобы объекты внутри списка были потокобезопасными, мне нужно блокировать каждый из них, итерации по списку и работы с объектами, правильно? –
@JoroSeksa, если вы убедитесь, что объекты могут быть получены только через arraylist.get(), тогда код в вашем сообщении в порядке. – Juvanis
Три возможности: (1) Если объекты, содержащиеся в списке, по сути являются потокобезопасными (например, неизменяемыми), вы в порядке. (2) иметь отдельные блокировки для каждого объекта в списке (например, синхронизировать с самим объектом при его доступе) (3) использовать глобальную блокировку всякий раз, когда вы обращаетесь к такому объекту (например, всегда синхронизироваться в списке, даже если доступ к ссылке ранее из списка). – Pyranja