2010-12-15 94 views
1

我想驗證以下我寫的驗證事實,即兩個線程可以同時訪問靜態同步方法和非靜態同步方法(因爲鎖在不同的對象上)。我得到了一個結果,但想知道我的解釋是否正確實例和靜態方法的併發測試的有效性

我跑了下面的代碼,我看到變量我分別在靜態和非靜態方法打印時相同的值。這是對靜態和非靜態方法鎖定兩個不同對象並且兩個線程可以同時訪問它們這一事實的有效證明。

代碼

import java.util.ArrayList; 
import java.util.List; 

public class TestStaticSynchronize { 

public static final TesteeClass obj = new TesteeClass(); 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    for(int i = 0; i < 50; i++) { 
     Runner run = new Runner(i); 
     Thread th = new Thread(run); 
     th.start(); 
    } 
} 

static class Runner implements Runnable { 

    private int i; 

    public Runner(int i) { 
     this.i = i; 
    } 

    public void run() { 
     if(i % 2 == 0) { 
      TesteeClass.staticSync(); 
     } else { 
      obj.instanceSync(); 
     } 
    } 

} 
} 

class TesteeClass { 

private static List<Integer> testList = new ArrayList<Integer>(); 


public static synchronized void staticSync() { 
    System.out.println("Reached static synchronized method " + testList.size()); 
    testList.add(1); 
} 

public synchronized void instanceSync() { 
    System.out.println("Reach instance synchronized method " + testList.size()); 
    testList.add(1); 
} 
} 

回答

1

你的評價是正確的。這是爲什麼。

所以,把你的同步實例方法,讓我們把它改寫在相當於synchronized塊符號:

public void instanceSync() { 
    synchronized(this) { 
     System.out.println("..."); 
     testList.add(1); 
    } 
} 

當你寫一個synchronized方法是同樣的事情鎖定對周圍實例(即此)。使用靜態方法,該參數不存在,那麼靜態的等效同步塊是什麼?它鎖定在Class對象上。

public void classSync() { 
    synchronized(TestClass.class) { 
     System.out.println("..."); 
     testList.add(1); 
    } 
} 

所以這個實例是與表示TestClass類的對象不同的對象。這意味着有兩個不同的鎖正在使用,這會導致您發現的問題。最後你的測試程序是非常危險的,而不是線程安全的。實例方法,特別是在多線程情況下使用時,不應觸及靜態成員期間。將這些訪問路由通過靜態方法進行路由很好,但直接訪問最糟糕的形式是嚴重錯誤。

有一種方式來編寫你的程序的方式,它們都鎖定在同一個對象上,但我認爲重要的是你考慮爲什麼你要寫這樣的代碼。是否因爲你真的只想要很多地方共享這樣的單一結構,但是無法獲得對單個對象的引用?這是軟件體系結構的核心,也是它在多線程應用程序中扮演的重要角色。我懷疑有比使用靜態成員更好的選擇,並且只使用一個所有位置都有引用的實例(希望不要使用單例模式,全局靜態等)。

+0

謝謝。我瞭解使用這種靜態成員的含義。但這似乎是驗證行爲的最佳方式。 – Fazal 2010-12-15 16:02:21

+0

夠公平的。如果你只是試圖證明這種行爲,那麼沒關係。 :-) – chubbsondubs 2010-12-15 19:04:32

相關問題