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

看板java作者 (非常念舊)時間6年前 (2018/01/06 10:17), 編輯推噓1(1041)
留言42則, 4人參與, 6年前最新討論串1/1
板友早安 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://www.ptt.cc/bbs/java/M.1515205074.A.975.html

01/06 10:39, 6年前 , 1F
變數就是看變數的生命週期,跟他所在的method無關
01/06 10:39, 1F

01/06 15:30, 6年前 , 2F
static跟thread-safe沒關係...
01/06 15:30, 2F

01/06 15:31, 6年前 , 3F
method裡的local變數都在stack上,不管是不是static method
01/06 15:31, 3F

01/06 15:32, 6年前 , 4F
static只影響執行method時的context是static還是有this
01/06 15:32, 4F

01/06 15:33, 6年前 , 5F
如果是class變數的話,不管是static還是instance都在heap
01/06 15:33, 5F

01/06 15:33, 6年前 , 6F
都有可能被別的thread存取的,所以static根本就無關
01/06 15:33, 6F

01/06 15:34, 6年前 , 7F
當然以上是指primitive變數,如果是reference變數,只要能
01/06 15:34, 7F

01/06 15:34, 6年前 , 8F
取得reference就能改,即使一開始是local也是能把reference
01/06 15:34, 8F

01/06 15:34, 6年前 , 9F
傳到別的地方
01/06 15:34, 9F

01/06 15:36, 6年前 , 10F
修正一下,能取得reference就能改reference到的物件,原變
01/06 15:36, 10F

01/06 15:36, 6年前 , 11F
數當然還是local就local
01/06 15:36, 11F

01/06 17:26, 6年前 , 12F
我資工白讀==,剛剛惡補了一下 stack 和 heap 的差別
01/06 17:26, 12F

01/06 17:27, 6年前 , 13F
static 會有可能有多條 thread 存取,那...這樣會影響
01/06 17:27, 13F

01/06 17:27, 6年前 , 14F
method 裡面 xxoo的運算嗎?
01/06 17:27, 14F

01/06 17:35, 6年前 , 15F
比如說假設我thread1要印出 oo ,然後 thread2剛好初
01/06 17:35, 15F

01/06 17:36, 6年前 , 16F
始化。會不會有可能印出初始化的值呢
01/06 17:36, 16F

01/06 18:38, 6年前 , 17F
01/06 18:38, 17F

01/06 18:50, 6年前 , 18F
以上連結內容跟S大獎的滿類似的
01/06 18:50, 18F

01/06 22:37, 6年前 , 19F
01/06 22:37, 19F

01/06 22:52, 6年前 , 20F
你要先知道最基本的一件事,java的每個thread有自己的stack
01/06 22:52, 20F

01/06 22:53, 6年前 , 21F
所以不同thread呼叫同一個method時,只共用程式碼,不會共
01/06 22:53, 21F

01/06 22:53, 6年前 , 22F
用任何local變數,不管method是不是static
01/06 22:53, 22F

01/06 22:54, 6年前 , 23F
不知道你的static會被多thread存取這觀念是哪個語言來的但
01/06 22:54, 23F

01/06 22:54, 6年前 , 24F
在java(或說jvm環境下)static跟這件事沒關係
01/06 22:54, 24F

01/07 09:58, 6年前 , 25F
了解了,感謝你們的指教 :)
01/07 09:58, 25F

01/07 09:59, 6年前 , 26F
我的意思是一個 class 宣告 static 方法,然後用此
01/07 09:59, 26F

01/07 10:00, 6年前 , 27F
class 宣告的物件,都是用同一個static方法,所以常
01/07 10:00, 27F

01/07 10:01, 6年前 , 28F
有可能多條 thread 存取到此方法的情況
01/07 10:01, 28F

01/07 10:25, 6年前 , 29F
p大,感謝你的連結。從上面回答來看意思是說
01/07 10:25, 29F

01/07 10:26, 6年前 , 30F
Test t = new Test(), t代表一個物件參考,是存在
01/07 10:26, 30F

01/07 10:28, 6年前 , 31F
stack上的,而new Test()是存在 shared的heap上。
01/07 10:28, 31F

01/07 10:33, 6年前 , 32F
所以,當相同object物件被呼叫時,被參考的物件就有
01/07 10:33, 32F

01/07 10:33, 6年前 , 33F
同步的問題,不知道這樣理解對不對呢
01/07 10:33, 33F

01/07 15:05, 6年前 , 34F
Test t = new Test()如果是在method裡面(不管是不是static)
01/07 15:05, 34F

01/07 15:07, 6年前 , 35F
只要沒有把t傳(複製)到會被別的thread存取的地方就沒問題
01/07 15:07, 35F

01/07 15:07, 6年前 , 36F
Test t = new Test()如果是個class的static變數或instance
01/07 15:07, 36F

01/07 15:08, 6年前 , 37F
變數,因為透過同個object或class能存取,較可能有同步問題
01/07 15:08, 37F

01/07 15:09, 6年前 , 38F
結論還是跟static沒有關係
01/07 15:09, 38F

01/07 15:10, 6年前 , 39F
"用此class宣告的物件,都是用同一個static方法"<這有點錯
01/07 15:10, 39F

01/07 15:11, 6年前 , 40F
方法的程式碼本來就只有一份,跟是否static、從哪呼叫無關
01/07 15:11, 40F

01/07 15:16, 6年前 , 41F
同步問題是看會不會同時存取同一份資料(變數),方法沒差
01/07 15:16, 41F

01/07 22:31, 6年前 , 42F
好的 謝謝s大
01/07 22:31, 42F
文章代碼(AID): #1QK37Ibr (java)