2012-02-13 25 views
0

我有一個關於Java同步的快速問題。另一個線程內部的Java同步

請假設下面的代碼:

public class Test { 
    private String address; 
    private int age; 

    public synchronized setAddress(String a) { 
     address = a; 
    } 

    public synchronized setAge(int a) { 
     age = a; 
    } 

    public synchronized void start() { 
      ... 

      listener = new Thread(new Runnable(){ 
       public void run() { 
         ... 
        setAge(10); 
         ... 

        synchronized(Test.this) { 
         address = null; 
        } 
       } 
      } 
    } 
} 

我有點不確定有關Java同步時同步方法或同步塊被稱爲另一個線程內。

假定線程運行類測試爲A,和 的監聽線程B.

然後,如果我執行上面的代碼,它保證同步的方法調用和同步塊與A的同步性(該線程運行測試類)?

謝謝您的閱讀。

回答

3

否,

同步的方法鎖定所述Test實例,而同步塊被鎖定Test類對象

Java synchronized static methods: lock on object or classJava Synchronized Block for .class

+0

對不起,我錯了。我只是將Test.class改爲Test.this。這是否意味着它們不同步? – 2012-02-13 04:37:43

+0

@ so-ju否,在這種情況下,它們*是同步的,因爲它們鎖定了同一個對象。 – 2012-02-13 04:42:27

+0

所以,你說在監聽線程中調用的同步塊或同步方法與在監聽線程之外調用的這些方法同步? – 2012-02-13 04:51:04