2015-09-16 3 views
0

enter image description hereПочему этот класс потокобезопасен?

если бы там была

public synchronized void deletePerson(Person p) 
     { mySet.remove();} 

тогда тоже будет оставаться поточно?

+0

'@ ThreadSafe' не является частью Java API. Он должен поставляться с сторонней библиотекой, и вы должны заглянуть в документацию для нее. Вы можете изучить этот вопрос: http://stackoverflow.com/questions/11362298/guardedby-threadsafe-notthreadsafe – dotvav

ответ

5

Этот класс поточно, поскольку существует только один изменяемые поля в нем (mySet), это private и все доступы к ней синхронизированы.

Да, public synchronized void deletePerson(Person p) { mySet.delete();} все равно сохранит этот класс поточно-безопасный.

Также обратите внимание, что ссылка на mySet не выходит из этого класса. Это также важно.

+0

Предположим, что есть два потока thread1 и thread2. thread1 получает блокировку объекта mySet, добавляет Person P1 через метод addPerson(), который блокирует блокировку. Из-за некоторых неудачных сроков может случиться так, что thread2 получает блокировку объекта mySet, удаляет Person P1 и освобождает блокировку. Тогда thread1 получит ложное значение из containsPerson(). – prvn

+0

@prvn - Нет, этого не может быть. * Синхронизация * устанавливает связь * происходит-до *. Таким образом, гарантируется, что до того, как блокировка будет получена, поток увидит все изменения, сделанные другими потоками – TheLostMind

+0

да, точно thread2 видит, что thread1 добавил P1, затем удаляет P1, thread1 видит сделанные изменения и поэтому, когда он вызывает containsPerson (), он получает ложное значение. Но этот сценарий мы не называем потокобезопасными. Если поток добавляет информацию, он должен получить ту же информацию, которую он добавил. Но здесь его не происходит. – prvn

0

mySet С является приватным и не подвергается воздействию извне класса через метод getMySet, вы можете получить доступ к состоянию объекта только с методами addPerson, containsPerson и deletePerson.

Поскольку эти 3 метода синхронизированы, только один из них может получить доступ к экземпляру класса (и изменить его состояние) в любой момент времени, поэтому класс является Thread Safe.

Смежные вопросы