疑問を抱いた時点は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"
- 初めに
console.log('a');
→ callstack に入ります。(FLOW) - コード実行
print('a')
してcallstackから離れます(POP) -
setTimeout(() => console.log('c'));
がcallstack に入ります。(FLOW) -
setTimeout
はJSにない処理のため実行を試したが実行失敗。 - callstackから離れ(POP)、該当処理を探すためWEB APIに入ります(FLOW)
- callstackが空になったので
console.log('b')
が入ります(FLOW) - コード実行
print('b'
してcallstackから離れます(POP) - web api実行結果がcallback queueに格納されていたらevent loopはcallstackに移す。(FLOW)
- コード実行
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/