2013-03-15 74 views
0

我在這裏有一個問題,在對象鎖定在java中。例如,代碼:在多線程中鎖定對象

public class A 
{ 
    private static A a = null; // singleton instance 

    private A() 
    { 

    } 

    public static synchronized A getInst() 
    { 
     if (a == null) 
     { 
      a = new A(); 
     } 
     return a; 
    } 

    public synchronized void method1() 
    { 
     //some action 
    } 

    public synchronized void method2() 
    { 
     //some action 
    } 
} 

當一個線程(比方說線程1)正在內部method1()然後線程1獲取單件物體上鎖定。但另一個線程(說線程2)想要輸入到method2()然後它將輸入而不等待線程1釋放鎖。 thread-1 and thread-2

感謝

回答

1

但另一個線程(比如線程2)希望在進入到方法2,然後將無需等待線程1,以釋放鎖進入。

它不會。

一次只有一個線程可以獲取對象上的鎖。

所以,除非thread-1釋放鎖定,thread-2不能執行method2

閱讀this

+0

但我觀察到,方法1和method2並行執行。 – 2013-03-15 11:38:48

+1

你可以發佈你的程序,顯示你在說什麼嗎? – Azodious 2013-03-15 11:40:23

+0

@ G.S你是如何測試你的代碼的,你是如何得出這個結論的? – 2013-03-15 11:54:25

0

您應該使用​​塊來使用特定的鎖對象而不是同步方法。 在這樣的情況下,也容易阻塞的地方需要鎖定方法,如果你不需要整個方法同步,這可能會加快多線程訪問只是特定部分。

例如

Object lock = new Object; 
public void method1() { 
    synchronized(lock) { 
     // do stuff here 
    } 
} 
0

在單例類中只有一個實例可用。所以當調用同步方法時,它會鎖定該單個實例。如果存在多個同步方法,則一次只執行一個方法。其他需要等待先前的方法來釋放鎖。所以基本上這個單例類只有一個線程存在。

如果你想其他方法不能因爲其他的方法來影響鎖,請使用synchronized塊在單例類對象的鎖。

private final Object object1 = new Object(); 
private final Object object2 = new Object(); 

public void method1 { 
    synchronized(object1) { 
    .... 
    } 
} 

public void method2 { 
    synchronized(object2) { 
    .... 
    } 
} 
0

兩個同步方法例如方法,因此,多線程將不能夠在同一時間訪問他們,如果他們都指相同的實例。在你情況下,這是真的,因爲你只需要你的類(模式)的一個實例,並作爲一個結果,如果一個線程訪問method1()那麼其他線程訪問method2()將處於等待狀態去,直到線程1釋放鎖或method1()完全執行。

0

但是另一個線程(比如線程2)想要進入method2 ,那麼它將進入而不用等待線程1釋放鎖。

雖然線程1執行method1()它是使用實例A的同步,線程2將等待,纔可以執行method2()這是使用相同的實例A的也同步(因爲它是的Singleton

你可以認爲它是同步代碼塊關鍵節),而不是同步的方法,如:

public void method1() 
{ 
    synchronized (this) 
    { 
     //some action 
    } 
} 

public void method2() 
{ 
    synchronized (this) 
    { 
     //some action 
    } 
} 

考慮到這樣,可以看到this相同實例(對象鎖)對於兩種方法