2013-03-14 3 views
0

Класс X имеет два способа: test и test1.java synchronized

Я создал два потока: t1 и t2. Тема t1 обращается к test методу и t2 обращается к test1 методу того же объекта. Когда t1 обращается к способу test, который синхронизировал его, получает блокировку на объекте.

Будет ли t2 иметь доступ к test1 способ на одном объекте? Почему он может получить доступ к этому методу, если у t1 есть блокировка?

Если я, выполняя следующий код

  X x = new X(); 
      new MyThread(x).start(); // It execute test() method 
     new MyThread1(x).start();// It execute test1() method 





class X 
{ 
    String a = "varsha"; 
    public synchronized void test() 
    { 
     try 
     { 
      Thread.sleep (6000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    public void test1() 
    { 
     synchronized (a) 
     { 
     } 
    } 
} 
+1

Пожалуйста, отформатируйте свой код. Это ужасно !!! –

ответ

3

У вас есть два различных замков:

  • test() замки this;
  • test1() замки this.a.

Эти две замки полностью независимы и, таким образом, можно одновременно вызвать два метода.

1

Ваш код эквивалентен следующему:

class X 
{ 
    String a = "varsha"; 
    public void test() 
    { 
     synchronized (this) 
     { 
      try 
      { 
       Thread.sleep (6000); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void test1() 
    { 
     synchronized(a) 
     { 
     } 
    } 
} 

Таким образом, эти методы синхронизации на различных объектах (this по сравнению с a) и, таким образом, могут быть выполнены одновременно без блокировки друг с другом.

Обратите внимание, что я заменил Thread.currentThread().sleep (6000) с Thread.sleep (6000), потому что метод sleep является статическим и, таким образом, вам не нужно любой экземпляр Thread для того, чтобы использовать его.

-1

Когда вы отмечаете синхронизированный метод, он блокирует объект для этого метода; что ни один другой поток не может получить доступ к этому PARTICULAR-методу для этого объекта. В вашем случае ни один другой поток не может получить доступ к методу тестирования; но, конечно, метод test1 может быть доступен.

+2

Это просто неправда. – NPE

+0

Предлагаю написать простой тест – pravat

0
class X { 

    String a = "varsha"; 

    public synchronized void test(){ 

    try {    
        //if you are modifying the instance variable here 
        // then the test1() synchronized block will 
       //not be given lock permission to t2 thread 
       // synchronization is for thread safety. 

       // In your example you are not modifying the instance variable. 

    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
} 
public void test1(){ 
    synchronized(a){ 
    } 
} 
} 
0

Вот что происходит на самом деле.
Каждый объект в Java имеет «блокировку монитора», в этом случае объект «x».

Есть две нитей (MyThread и MyThread1) пытаются получить эту блокировку в следующей последовательности -

Imagine существует очередь - MyThread находится перед MyThread1 в этой очереди, потому что вы начали MyThread первым следуете MyThread1.

MyThread сначала берет блокировку, и она начинает выполняться, вы вызывали на ней метод sleep(). Это изменит состояние MyThread с «состояния выполнения» на «состояние ожидания», а затем на «состояние готовности», оно освободит блокировку в данный момент, так как она не находится в состоянии выполнения. В этот момент MyThread1 впереди в очереди, и он получает блокировку и начинает выполнение.

Это похоже на концепцию «Контекстный коммутатор».См. Книгу - Внутренние системы и дизайн операционной системы.

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