網上看到好多定論說是區域性變數就是執行緒安全的。但是我覺得對大家都造成了一些誤解,例如
以下;
package test;
public class demo_5
}//售票視窗類
class ticketwindow implements runnable
if(me) catch (interruptedexception e)
}else
}} @override
public void run()
}
上面是乙個非執行緒安全類,執行結果如下:
thread-2在售出第1998張票
thread-0在售出第2000張票
thread-1在售出第1999張票
thread-1在售出第1997張票
thread-2在售出第1995張票
thread-0在售出第1996張票
thread-0在售出第1994張票
thread-1在售出第1994張票
thread-2在售出第1994張票
thread-2在售出第1993張票
thread-0在售出第1992張票
thread-1在售出第1991張票
thread-0在售出第1990張票
thread-1在售出第1989張票
thread-2在售出第1988張票
thread-1在售出第1987張票
同時售出相同第幾張票,也就是說執行緒不安全,我們追根溯本:來找下原因,雖然
int test;boolean me;這兩個都是區域性變數,但是nums是成員變數,即如果區域性變數引用了非可變成員變數,依然執行緒不安全!
再看下面這個事例:
package test;
public class demo_5
}//售票視窗類
class ticketwindow implements runnable
if(me) catch (interruptedexception e)
}else
}} @override
public void run()
}
執行結果如下:
thread-0在售出第2000張票
thread-2在售出第1998張票
thread-1在售出第1999張票
thread-1在售出第1995張票
thread-0在售出第1997張票
thread-2在售出第1996張票
thread-1在售出第1994張票
thread-0在售出第1992張票
thread-2在售出第1993張票
thread-1在售出第1991張票
thread-0在售出第1990張票
thread-2在售出第1989張票
thread-1在售出第1986張票
thread-2在售出第1988張票
thread-0在售出第1987張票
thread-1在售出第1985張票
thread-0在售出第1983張票
thread-2在售出第1984張票
則沒有重複的,則該執行緒安全
區域性變數保證執行緒安全
首先來看string這個類的hashcode方法,如下 public inthashcode hash h return h hash是string類的乙個屬性,可以看到這邊首先是 讀取了本地屬性的值,並且賦值給區域性變數h。並且使用h進行了業務邏輯的判斷。如果h沒有值的話,就進行 hash 值的生...
關於區域性變數
問題 include int foo intmain 最後會列印 58 理論上,a是區域性變數,所以a的位址在foo 函式返回時就釋放了,那為什麼還能讀取到5這個值呢。這個行為是不好的,雖然還可以讀取5,但是並不代表5這個值是安全的,我們不知道會有什麼樣的行為會改變它,因此它可以是5也可以是乙個隨機...
為什麼區域性變數是執行緒安全的
例如,有三個方法 a b c,他們的呼叫關係是 a b c a 呼叫 b,b 呼叫 c 在執行時,會構建出下面這樣的呼叫棧。每個方法在呼叫棧裡都有自己的獨立空間,稱為棧幀,每個棧幀裡都有對應方法需要的引數和返回位址。當呼叫方法時,會建立新的棧幀,並壓入呼叫棧 當方法返回時,對應的棧幀就會被自動彈出。...