關於區域性變數就是執行緒安全的理解

2021-09-16 20:35:24 字數 1619 閱讀 8564

網上看到好多定論說是區域性變數就是執行緒安全的。但是我覺得對大家都造成了一些誤解,例如

以下;

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 在執行時,會構建出下面這樣的呼叫棧。每個方法在呼叫棧裡都有自己的獨立空間,稱為棧幀,每個棧幀裡都有對應方法需要的引數和返回位址。當呼叫方法時,會建立新的棧幀,並壓入呼叫棧 當方法返回時,對應的棧幀就會被自動彈出。...