スレッド
https://ja.wikipedia.org/wiki/ABA問題
プロセス の実行単位
プロセスは メインスレッド(プライマリスレッド)と呼ばれる単一のスレッドで開始される
プロセス とは異なり、メモリ空間 を共有するため 異なるスレッド間で同じデータにアクセス可能
そのため、複数スレッドから同じデータにアクセスするときには、アクセスする順序を意識する必要がある
競合状態
e.g. ABA 問題
あるデータを初期化し、再度同じデータを読んで値を確認する プログラム を考える
このプログラムをスレッド A で実行する
しかし、異なるプログラムがスレッド B で動いていたとして、スレッド B からデータを書き換えたとする
この書き換えが A のデータ初期化と読み込みの間で起こった場合、スレッド A のプログラムから見ればデータが勝手に書き換わったように見える
データ競合
そのため、複数スレッドを扱う際には、ロック などを用いて ABA のような予期せぬ問題が起きないようにする
ただし、デッドロック など別の問題が起きるため、いずれにせよ細心の注意が必要
そのため Clojure では STM を採用している
シングルスレッド: 1 つのスレッドを持つプロセス
マルチスレッド: 複数のスレッドを持つプロセス