[問題] 關於一個 Thread safe的程式

作者: gn00618777 (非常念舊)   2018-01-06 10:17:50
板友早安
class Test{
public void test1()
{
int xx;
int 00;
..
..
}
public static void test2()
{
int xx;
int 00;
..
..
}
}
我們都知道一個 thread safe 的程式都是盡量宣告local不要static
第一個method假設有兩條 thread,運行的變數都存在自己thread的記憶體。
那第二個method呢? 他是屬於 class 的 method 不是物件的,但裡面又是區域變數
假設有兩個物件,同時呼叫static的method,裡面是區域變數,是各自屬於thread的
記憶體嗎? 還是因為是static的,所有都是同屬記憶體,裡面的運算內容會影響到呢?
謝謝指教
作者: mars90226 (火星人)   2018-01-06 10:39:00
變數就是看變數的生命週期,跟他所在的method無關
作者: ssccg (23)   2018-01-06 15:30:00
static跟thread-safe沒關係...method裡的local變數都在stack上,不管是不是static methodstatic只影響執行method時的context是static還是有this如果是class變數的話,不管是static還是instance都在heap都有可能被別的thread存取的,所以static根本就無關當然以上是指primitive變數,如果是reference變數,只要能取得reference就能改,即使一開始是local也是能把reference傳到別的地方修正一下,能取得reference就能改reference到的物件,原變數當然還是local就local
作者: gn00618777 (非常念舊)   2018-01-06 17:26:00
我資工白讀==,剛剛惡補了一下 stack 和 heap 的差別static 會有可能有多條 thread 存取,那...這樣會影響method 裡面 xxoo的運算嗎?比如說假設我thread1要印出 oo ,然後 thread2剛好初始化。會不會有可能印出初始化的值呢https://goo.gl/xEuhB4以上連結內容跟S大獎的滿類似的
作者: pttworld (批踢踢世界)   2018-01-06 22:37:00
作者: ssccg (23)   2018-01-06 22:52:00
你要先知道最基本的一件事,java的每個thread有自己的stack所以不同thread呼叫同一個method時,只共用程式碼,不會共用任何local變數,不管method是不是static不知道你的static會被多thread存取這觀念是哪個語言來的但在java(或說jvm環境下)static跟這件事沒關係
作者: gn00618777 (非常念舊)   2018-01-07 09:58:00
了解了,感謝你們的指教 :)我的意思是一個 class 宣告 static 方法,然後用此class 宣告的物件,都是用同一個static方法,所以常有可能多條 thread 存取到此方法的情況p大,感謝你的連結。從上面回答來看意思是說Test t = new Test(), t代表一個物件參考,是存在stack上的,而new Test()是存在 shared的heap上。所以,當相同object物件被呼叫時,被參考的物件就有同步的問題,不知道這樣理解對不對呢
作者: ssccg (23)   2018-01-07 15:05:00
Test t = new Test()如果是在method裡面(不管是不是static)只要沒有把t傳(複製)到會被別的thread存取的地方就沒問題Test t = new Test()如果是個class的static變數或instance變數,因為透過同個object或class能存取,較可能有同步問題結論還是跟static沒有關係"用此class宣告的物件,都是用同一個static方法"<這有點錯方法的程式碼本來就只有一份,跟是否static、從哪呼叫無關同步問題是看會不會同時存取同一份資料(變數),方法沒差
作者: gn00618777 (非常念舊)   2018-01-07 22:31:00
好的 謝謝s大

Links booklink

Contact Us: admin [ a t ] ucptt.com