java 板


LINE

板友早安 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的,所有都是同屬記憶體,裡面的運算內容會影響到呢? 謝謝指教 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 119.14.189.37
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1515205074.A.975.html
1F:推 mars90226: 變數就是看變數的生命週期,跟他所在的method無關 01/06 10:39
2F:→ ssccg: static跟thread-safe沒關係... 01/06 15:30
3F:→ ssccg: method裡的local變數都在stack上,不管是不是static method 01/06 15:31
4F:→ ssccg: static只影響執行method時的context是static還是有this 01/06 15:32
5F:→ ssccg: 如果是class變數的話,不管是static還是instance都在heap 01/06 15:33
6F:→ ssccg: 都有可能被別的thread存取的,所以static根本就無關 01/06 15:33
7F:→ ssccg: 當然以上是指primitive變數,如果是reference變數,只要能 01/06 15:34
8F:→ ssccg: 取得reference就能改,即使一開始是local也是能把reference 01/06 15:34
9F:→ ssccg: 傳到別的地方 01/06 15:34
10F:→ ssccg: 修正一下,能取得reference就能改reference到的物件,原變 01/06 15:36
11F:→ ssccg: 數當然還是local就local 01/06 15:36
12F:→ gn00618777: 我資工白讀==,剛剛惡補了一下 stack 和 heap 的差別 01/06 17:26
13F:→ gn00618777: static 會有可能有多條 thread 存取,那...這樣會影響 01/06 17:27
14F:→ gn00618777: method 裡面 xxoo的運算嗎? 01/06 17:27
15F:→ gn00618777: 比如說假設我thread1要印出 oo ,然後 thread2剛好初 01/06 17:35
16F:→ gn00618777: 始化。會不會有可能印出初始化的值呢 01/06 17:36
17F:→ gn00618777: https://goo.gl/xEuhB4 01/06 18:38
18F:→ gn00618777: 以上連結內容跟S大獎的滿類似的 01/06 18:50
19F:→ pttworld: https://goo.gl/TRxnwm 01/06 22:37
20F:→ ssccg: 你要先知道最基本的一件事,java的每個thread有自己的stack 01/06 22:52
21F:→ ssccg: 所以不同thread呼叫同一個method時,只共用程式碼,不會共 01/06 22:53
22F:→ ssccg: 用任何local變數,不管method是不是static 01/06 22:53
23F:→ ssccg: 不知道你的static會被多thread存取這觀念是哪個語言來的但 01/06 22:54
24F:→ ssccg: 在java(或說jvm環境下)static跟這件事沒關係 01/06 22:54
25F:→ gn00618777: 了解了,感謝你們的指教 :) 01/07 09:58
26F:→ gn00618777: 我的意思是一個 class 宣告 static 方法,然後用此 01/07 09:59
27F:→ gn00618777: class 宣告的物件,都是用同一個static方法,所以常 01/07 10:00
28F:→ gn00618777: 有可能多條 thread 存取到此方法的情況 01/07 10:01
29F:→ gn00618777: p大,感謝你的連結。從上面回答來看意思是說 01/07 10:25
30F:→ gn00618777: Test t = new Test(), t代表一個物件參考,是存在 01/07 10:26
31F:→ gn00618777: stack上的,而new Test()是存在 shared的heap上。 01/07 10:28
32F:→ gn00618777: 所以,當相同object物件被呼叫時,被參考的物件就有 01/07 10:33
33F:→ gn00618777: 同步的問題,不知道這樣理解對不對呢 01/07 10:33
34F:→ ssccg: Test t = new Test()如果是在method裡面(不管是不是static) 01/07 15:05
35F:→ ssccg: 只要沒有把t傳(複製)到會被別的thread存取的地方就沒問題 01/07 15:07
36F:→ ssccg: Test t = new Test()如果是個class的static變數或instance 01/07 15:07
37F:→ ssccg: 變數,因為透過同個object或class能存取,較可能有同步問題 01/07 15:08
38F:→ ssccg: 結論還是跟static沒有關係 01/07 15:09
39F:→ ssccg: "用此class宣告的物件,都是用同一個static方法"<這有點錯 01/07 15:10
40F:→ ssccg: 方法的程式碼本來就只有一份,跟是否static、從哪呼叫無關 01/07 15:11
41F:→ ssccg: 同步問題是看會不會同時存取同一份資料(變數),方法沒差 01/07 15:16
42F:→ gn00618777: 好的 謝謝s大 01/07 22:31







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP