あとでほんとにちゃんと書きます。たぶん。
とりあえずメモ。
スレッドごとに持てるグローバル変数ですよね。私はメソッド呼び出しの「環境」を渡すのに使ってます。例えばdRubyではアプリケーションのメソッドの引数にdRubyの環境を追加するわけにはいかないので、スレッド固有データを使う以外に良い方法がなかったんですよね。
グローバル変数ではなくスレッド固有データなのは、スレッド単位にメソッド呼び出しのコンテキストが存在するからです。ってわかりにくいですね。RMIの始まりによって新しいスレッドが生成され*1、RMIの環境をスレッド固有データに覚えてもらいます。そのスレッド内で発生するすべてのメソッド呼び出しはそのRMIの環境の影響をうけます。具体的にはどのDRbServerのDRbObjectにすべきか、が変化するんだけど。通常はいないけど、メソッドがRMIかそうでないかで動作を変えたい、たとえば要求元をチェックしたい、ときにはその環境を覗いたりもできますが、それはおまけかなあ。
他にRDBのコネクション、トランザクションをそこに忍ばせるような使い方をするときがあったけど、それはまた今度書きます。DBI/DBDのPoolや、PRb、Koyaなんかの根っこでよく使ってました。
*1:ちょっと嘘