2015-01-10 5 views
1

«Этот» объект отличается для двух потоков, так как они представляют собой два разных объекта. Таким образом, они проверяют два разных замка, так что ничто не должно мешать им работать в параллельном критической секции:Почему синхронизировано (это) работает?

void method() { 
    synchronized(this) { 
     //critical section 
    } 
} 

Что мне не хватает?

+2

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

ответ

1

Ниже приведен пример, где это тот же объект для двух потоков:

class Test { 

    void method() { 
     synchronized(this) { 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     final Test t1 = new Test(); 
     new Thread() { 
      public void run() { 
       t1.method(); 
      }; 
     }.start(); 
     new Thread() { 
      public void run() { 
       t1.method(); 
      }; 
     }.start(); 
    } 
} 
+0

Ваш пример дал понять, что «это» был объектом Thread, поскольку в статье, которую я читал, был предоставлен только короткий блок кода. – huehuehuehue

0

Вы ничего не пропустите. Если ваши потоки попытаются применить synchronized и попытаться заблокировать мониторы двух разных объектов, они не будут блокировать друг друга.

2

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

Возможно, вы пропустили, если объекты одного и того же типа работают на общем ресурсе, синхронизированы (это), которые не будут блокировать их от параллельного доступа к нему. В этом случае вы можете синхронизировать сам класс, используя synchronized(MyFoo.class) { } или общую переменную.

+0

Спасибо за подсказку – huehuehuehue

0

Каждый объект на Java имеет механизм блокировки, и только один поток за раз может занять замок. Когда вы окружаете блок кода с синхронизацией (this) или добавляете ключевое слово synchronize к методу, он ограничивает только один поток этими синхронизированными областями для этого объекта. Он не имеет ничего общего с потоковыми экземплярами, и два экземпляра одного и того же класса не имеют блокировки.

0

Если несколько потоков одного и того же объекта называют метод(); то в то время только один поток будет получать монитор объекта. но если есть разные - разные объекты того же типа, то они могут вводить параллельный путь.

Единственная проблема в этом коде будет возникать, когда у вас есть какая-либо переменная класса, поэтому все это время будет использоваться для блокировки уровня класса.

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