關於多執行緒訪問靜態方法的問題

hganbo發表於2004-12-15
小弟最近在做一個專案遇到一點執行緒同步的問題,還沒有找出具體的問題。
懷疑問題出在多執行緒訪問靜態方法上,但沒有找到有相關資料講這方面的問題,所以只好請教一下各位java高手了。

我的原來程式是這樣設計的,對於一些常用的方法,都用靜態方法來實現,在多執行緒程式中直接呼叫,靜態方法由於沒有使用靜態變數,所以沒有進行執行緒同步。

類似以下程式:

class ThreadI {
public static void main(String[] arg) {

TestI p = new TestI("thread 1");
new TestI("thread 2").start();
new TestI("thread 3").start();
new TestI("thread 4").start();
new TestI("thread 5").start();
new TestI("thread 6").start();
new TestI("thread 7").start();
new TestI("thread 8").start();
new TestI("thread 9").start();
new TestI("thread 10").start();
new TestI("thread 11").start();
new TestI("thread 12").start();
new TestI("thread 13").start();
new TestI("thread 14").start();
new TestI("thread 15").start();
new TestI("thread 16").start();
new TestI("thread 17").start();
new TestI("thread 18").start();
new TestI("thread 19").start();
new TestI("thread 20").start();
p.start();
}
}

class TestI extends Thread {
String s ;
TestI(String sTemp){
this.s = sTemp;
}
public void run() {
try{

Thread.currentThread().sleep( 1000*5);
}catch(Exception ex){}

for(int i=0;i<100;i++){
System.out.println(T.t( this.s + " "+ i));
}
}
}

class T{
public static String t(String sTemp){
String aa = sTemp;
return aa;
}
}


從上面的例子程式打出的結果,我看不出有執行緒訪問衝突的地方。

我的疑問是:對於T.t這種靜態方法,在不同執行緒呼叫時,jvm究竟是怎麼進行處理的?
我自己的理解是對於這樣的靜態方法是先例項化成各執行緒堆疊內的具體方法,然後再進行運算,由於都是區域性變數,沒有使用靜態變數,各執行緒之間是不存在資源衝突的。但沒有找到資料來證實這樣的理解,所以比較煩惱。還請各位幫忙解決一下。

相關文章