2013-11-07 3 views
0

Когда использовать закрытый объект блокировки для синхронизации блока?частный объект блокировки и блокировка на стороне клиента

Object lock =new Object(); 
synchronized(lock) 
{ } 

Когда использовать блокировку на стороне клиента для синхронизации блока?

private final List<InetAddress> ips = 
Collections.synchronizedList(new ArrayList<InetAddress>()); 
synchronized(ips) 
{ } 

Почему блокировка на стороне клиента не является предпочтительной?

ответ

0

Объект должен использоваться явно для блокировки в синхронизированных блоках внутри методов класса. Эта внутренняя блокировка связана с экземпляром частного объекта, а не класса. Следовательно, между методами этого класса и методами враждебного класса не существует конкуренции за блокировку (так как это хорошая практика объявлять блокировки объектов как частные и окончательные).

При блокировке на стороне клиента класс содержит блокировку объекта, доступного для других классов. Блокировка на стороне клиента влечет за собой защиту кода клиента, который использует некоторый объект X с блокировкой X, для защиты своего собственного состояния. Чтобы использовать блокировку на стороне клиента, вы должны знать, что использует блокировка X. блокировка на стороне клиента еще более хрупкая, поскольку она влечет за собой включение кода блокировки для класса в классы, которые полностью не связаны с этим конкретным классом.

Например, если класс А имеет методы, которые используют метод synchronization.Another класс B имеет ссылку на класс A и использует объект класса A в качестве блокировки для синхронизации блоков в методе. Если когда-нибудь стратегия блокировки класса A будет изменена для использования частного конечного объекта блокировки, тогда стратегия блокировки класса B будет нарушена, потому что потоки, которые вызывают методы класса A, будут придерживаться новой стратегии блокировки, тогда как методы класса B все еще используют объект класса A в качестве замка. Следовательно, реализация будет использовать два разных замка.