Может кто-нибудь объяснить разницу между этими двумя примерами в контексте блокировки объекта:
public void method1(){
synchronized(this){
....
}
}
И
StringBuffer aStringBufferObject = new StringBuffer("A");
public void method2(){
synchronized(aStringBufferObject){
....
}
}
Я знаю, что первый пример получит блокировку экземпляра this
, а второй получит блокировку экземпляра aStringBufferObject. Но я действительно не понимаю, каков эффект или разница между ними.
Например, во втором примере смогут ли потоки по-прежнему выполнять код внутри синхронизированного блока, потому что блокировка не связана с экземпляром this?
Я знаю, что синхронизация метода или блока кода предотвращает одновременный доступ нескольких потоков к этому блоку/методу, но какова цель указания объекта для блокировки и в чем разница в способе указания объекта, как в приведенные выше примеры?
synchronized(this)
, потому что он также синхронизируется с методамиsynchronized
, и вы можете получить тупиковые ситуации. Вы также можете столкнуться с взаимоблокировками, если кто-то использует объект в качестве блокировки где-то еще в коде. Я помню, как читал комментарий одного из создателей Java, в котором говорилось, что они не должны были разрешать блокировку объектов, а только использование выделенных блокировок (т.е.java.util.concurrent.locks
). - person toto2   schedule 24.07.2011