2013-03-14 75 views
0

X有兩種方法:testtest1java同步

我創建了兩個線程:t1t2。線程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

請格式化您的代碼。這太可怕了! – 2013-03-14 07:17:18

回答

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) 
     { 
     } 
    } 
} 

所以這些方法是在不同的對象(thisa)同步,從而可以在不鎖定彼此併發地執行。

注意,我換成Thread.currentThread().sleep (6000)Thread.sleep (6000)因爲方法sleep是靜態的,因此你不需要的Thread任何情況下,才能使用它。

-1

將方法標記爲synchronized時,會鎖定該方法的對象;意味着沒有其他線程可以訪問該對象的PARTICULAR方法。在你的情況下,沒有其他線程可以訪問測試方法;但是當然可以訪問test1方法。

+2

這根本不是真的。 – NPE 2013-03-14 07:24:39

+0

我建議寫一個簡單的測試 – pravat 2013-03-18 03:36:07

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)試圖獲取這個鎖以下順序 -

想象有一個隊列 - MyThread的是MyThread1前在這個隊列中,因爲你剛開始MyThread的後面MyThread1。

MyThread首先獲取鎖並開始執行,您已經調用了sleep()方法。這將使MyThread的狀態從「執行狀態」變爲「等待狀態」,然後變爲「就緒狀態」,此時它將釋放鎖,因爲它不處於執行狀態。此時,MyThread1在隊列中領先,並獲取鎖並開始執行。

這與「上下文切換」的概念類似。請參閱本書 - 操作系統內部和設計。