→ tyf99:我覺得 js 的能耐,還是要看 browser 的 js 引擎 11/05 00:25
→ tyf99:browser js vm 夠好,js 可做到的事超乎想像 11/05 00:26
→ sk1765:我實測的結果 AB一定一起出現 CD一定一起出現 不會AC BD 11/05 01:16
→ sk1765:我的程式是 12一組 34一組 不會13 24 只會 1234或3412 11/05 01:18
→ sk1765:所以兩個function內部的每一行statement也是不分的 11/05 01:20
→ sk1765:只要包成一個function 兩function都是順序執行 11/05 01:21
→ sk1765:沒有打散一行一行 一起同步 所以應該完全沒有synchronized 11/05 01:23
→ sk1765:的要求 因為實測看來他都是整個function丟到queue裡排隊 11/05 01:24
推 linhomeyeu:看瀏覽器實作吧 這部分語言本身沒有規範 11/05 01:25
→ linhomeyeu:也就是可以同步。 玩玩看Node.JS吧這邊好像沒人在玩? 11/05 01:25
→ sk1765:Node.JS不知道server哪裡有可以下載 所以一直沒玩 11/05 01:33
推 LaPass:那請問,如果A、B間插一個Thread.Sleep(30000);之類的東西 11/05 01:34
→ LaPass:會怎麼辦?或是無限迴圈、或是會執行很久的程式碼。 11/05 01:35
→ LaPass:我只看過js的使用手冊而已,還不太會.... 11/05 01:36
→ sk1765:所以javascript才會根本沒有sleep這種東西 11/05 01:38
→ sk1765:因為根本沒有thread 不能多工 這是我的認知 11/05 01:39
推 LaPass:原來如此,了解.... 11/05 02:27
→ tyf99:google 了一下,js 多工與否完全繫於 browser vm 上 11/05 02:31
→ tyf99:但是以往的 js 程式,幾乎全以沒有多工的考量下去寫的 11/05 02:31
→ tyf99:google chrome 好像曾經有把多工給加上去 11/05 02:32
→ tyf99:結果在許多現有的網頁下,會出現 concurrency issues 11/05 02:33
→ tyf99:所以可以說 "目前通用的 browser vm,都不讓 js 多工" 11/05 02:34
→ TonyQ:ACBD是可能會出現的,但是會出現在複雜的測試環境下。 11/05 04:30
→ TonyQ:當你頁面中有多個script file 同時讀取時,這偶爾會發生。 11/05 04:30
→ TonyQ:其實複雜的狀況是在於像是你塞多個script tag到head 11/05 04:31
→ TonyQ:然後同時你又進行script的讀取,同時間你又有setTimeout 11/05 04:31
→ TonyQ:setInterval , 有些狀況下你很難確保當時的變數狀況. 11/05 04:31
→ TonyQ:synchronized 的要求一定存在,因為你可能透過 closure 存取 11/05 04:32
→ TonyQ:外面的變數,此時你如何確保 setTimeout 跟外面的執行續。:P 11/05 04:33
→ TonyQ:另外 js 基本上不作成multiple thread 不是因為沒有考量, 11/05 04:34
→ TonyQ:是因為在 multiple thread的狀況下要維持變數狀態變得很困難 11/05 04:34
→ TonyQ:像是java要在thread裡面存取的變數也必須設成final一樣 11/05 04:37
→ TonyQ:但是js 沒有這類的限制 所以設計起來會很困難... 11/05 04:37
→ TonyQ:做不到這件事情不是說他差,做得到也不見得就是好事,只是 11/05 04:40
→ TonyQ:陳述一種語言特性而已。事實上我處理的複雜狀況是在幾萬行js 11/05 04:40
→ TonyQ:的同時執行下才出現的複雜條件,一般狀況下也很難碰到。XD 11/05 04:41
→ TonyQ:我是覺得應該要盡量避免這麼嚴苛的情況,:P 11/05 04:42
→ TonyQ:舉例按著按鍵不放時,只要設立一個「處理中」的flag, 11/05 04:42
→ TonyQ:當處理中就忽略之後送來的相同事件之類的。 11/05 04:42
→ TonyQ:這種處理方案在各種 widget 中很常見。 11/05 04:43
推 ec75413:所以說 Bakery Algorithm 依然是「割雞用牛刀」囉? 11/05 09:52
→ sk1765:你們可能想得太複雜了 反正他就是一個queue 任何執行段都 11/05 10:14
→ sk1765:丟到這個queue排隊 決不會有兩個執行段同時間交錯執行 11/05 10:15
→ sk1765:至少在browser client端是這樣 至於node.js要變成server端 11/05 10:17
→ sk1765:他很有可能會做multithread 不然就不叫server了吧 11/05 10:18
→ sk1765:我是不知道asp jsp php是不是也可以thread 但java可以 11/05 10:18
→ sk1765:另外<script>tag他也是一整個tag視成一個執行段 覺不會有 11/05 10:20
→ sk1765:兩個<script>同時交錯執行 但是有載入先後的問題 11/05 10:20
→ sk1765:那只要簡單的flag判斷必須先載入的是否完成就行了 11/05 10:21
→ sk1765:當然如果把程式分在很多<script>裡 這樣不斷的放入<script> 11/05 10:22
→ sk1765:這樣就有可能造成程式是一小段一小段的交錯 11/05 10:23
→ sk1765:可是這不是synchronized的問題阿 synchronized只在確保他的 11/05 10:28
→ sk1765:段落裡是互斥的critical section 11/05 10:30
→ sk1765:在queue裡基本上就已經是一個critical section了因為他排隊 11/05 10:34
→ sk1765:執行 如果不這樣 我們光是作<script src='a.js'> 11/05 10:36
→ sk1765:<script src='b.js'> 兩個script交錯執行的話 程式恐怕不是 11/05 10:37
→ sk1765:我們平常這樣一行一行寫 但這種掛很多js平常就很常見阿 11/05 10:38
→ sk1765:程式裡也不用做synchronized 頂多就判斷是否載入完成 11/05 10:39
→ sk1765:總之 在同一個<script>裡 是沒有synchronized的問題的 11/05 10:43
→ legnaleurc:照你的說法,單核的OS也沒有multithread,反正都是丟到 11/05 15:34
→ legnaleurc:task queue 裡執行不是嗎? 11/05 15:35
推 UniFish:nodeJS舉手 11/05 21:00
→ TonyQ:最好是一個script 是一個執行段,那script裡面的setTimeout 11/05 22:42
→ TonyQ:要怎麼算在同一個執行段?下一個<script>必須等到上一個的 11/05 22:42
→ TonyQ:setTimeout或setInterval都跑完才能動? 11/05 22:43
→ TonyQ:還是你說script 裡面的timeout 是另外當成獨立的執行段? 11/05 22:44
→ TonyQ:基本上真正的 critical session 碰見的機率並不高,因為一般 11/06 11:33
→ TonyQ:而言 script 的執行表現都不錯,只有在很極端的狀況會碰到。 11/06 11:33
→ TonyQ:我也只有碰過2-3次而已,所基本上可以當特例看。 11/06 11:34
→ tyx:多工不一定是 multithread 11/07 03:49
→ tyx:Non - Preemptive Multitasking 就不是 11/07 03:55
→ tyx:也沒有 synchronize 問題 11/07 03:57
→ sk1765:恩 我的用詞不精準 跟多工沒關係 11/07 14:08