0
1

More than 3 years have passed since last update.

何でJavaScriptはsingleThreadを選んだんだろう。

Posted at

疑問を抱いた時点はtypeScriptを勉強したところ読んでしまったある文章。

 ジャヴァスクリプトは単一スレッド(single-thread)で動作するため、できる限りreadFileSyncのような同期APIは使用を控えましょう。

あれれ。それではJAVAのマルティスレッドとはどう違うのだろ。


まずはjavaScriptから呼出があった場合を流れを探ってみましょう。

console.log('a');
setTimeout(() => console.log('c'));
console.log('b');![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070645/c74924d9-179d-ffa0-df6e-7be42ecd3f57.png)

結果はアルファベットから予想野通り "a, "b", "c"

この呼出を始まりに行われる環境を見てみよう。
image.png

  1. 初めにconsole.log('a'); → callstack に入ります。(FLOW)
  2. コード実行print('a')してcallstackから離れます(POP)
  3. setTimeout(() => console.log('c'));がcallstack に入ります。(FLOW)
  4. setTimeoutはJSにない処理のため実行を試したが実行失敗。
  5. callstackから離れ(POP)、該当処理を探すためWEB APIに入ります(FLOW)
  6. callstackが空になったのでconsole.log('b')が入ります(FLOW)
  7. コード実行print('b'してcallstackから離れます(POP)
  8. web api実行結果がcallback queueに格納されていたらevent loopはcallstackに移す。(FLOW)
  9. コード実行print('c')してcallstackから離れます(POP)
( *event loop: call stack, web api, callback queue を回しながらstackからweb apiに移したり、リターンをcallback queueからcall stackに移します)

それではどうしでsingle threadを使うのでしょう。まずはjavaのmulti threadを見てみましょう。

multi threadの強さはマルチ作業が可能にすること。例え音楽を聴きながら(作業①)、コーディングをしること(作業②)。各スレッドはメモリを割り当てられるのでエラー発生にも自分の領域以外を影響を及ぼさないです。
multi threadの困ることは同時性。各違うスレッドが同時に同じ変数の値を変更した場合などで意図してなかった処理が発生しかねません。そのため、スレッドのスケジューリングは気にしないといけなません。

javascriptのsingle threadは当たり前だがスレッドのスケジューリングを気にすることはなく、一スレッドでAYSNCなどの同期APIなどで内部スケジューリングだけコントロールすればより高い反応性、同時性を保つことができます。また内部スケジューリングでマルチ作業も可能にさせます。


参照資料
https://www.geeksforgeeks.org/why-javascript-is-a-single-thread-language-that-can-be-non-blocking/

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1