あなたが言及したように、「これをしないでください」という答えがたくさんあります。ほとんどのスレッドは、Java によって使用される OS スレッドとして読み取られるようです。投稿でErlangについて言及したので、よりErlang中心の回答を投稿したいと思います。
この種のシミュレーションをプロセス (またはアクター、マイクロ スレッド、グリーン スレッドと呼ばれることもあります) でモデル化する場合、同期は必ずしも必要ではありません。本質的に、シミュレートする必要がある物理オブジェクトがいくつかあります (ほとんどの場合、数千または数十万)。これらのオブジェクトを可能な限り現実的にシミュレートしたいのですが、おそらく何らかのリアルタイムの側面も関係しているでしょう(そうである必要はありませんが、質問ではこれについて言及していません)。
簡単な解決策は、オブジェクトごとに Erlang プロセスを生成し、それらすべてにティックを送信し、次のティックに進む前にシミュレーションの結果を収集することです。これは実際にはすべてを同期しています。もちろん、これはより決定論的なソリューションであり、リアルタイムのプロパティを保証するものではありません。また、計算に必要なデータを取得するためにプロセスがどのように相互に通信するかも重要です。おそらくそれらを巧妙な方法でグループ化する必要があり (衝突グループなど)、休止中のオブジェクトのプロセスを休止状態にする必要があります (Erlang は適切にサポートしています)。
リアルタイムのプロパティを取得するには、おそらくプロセスによって実行される計算を制限する必要があります (速度と引き換えに精度)。これはおそらく、応答を待たずにティックを送信し、オブジェクト プロセスが現在の位置と必要なその他のデータを各ティックに返信できるようにすることで実行できます (ただし、その時点では概算でしかない場合もあります)。DJClayworthが言うように、これはシミュレーションでエラーが蓄積する可能性があります。
ある意味では、問題は、並行性の強さを利用して、ここで何らかの利点を得ることができるかどうかです。同期が必要な場合は、各物理オブジェクト間の同時実行が不要であることを示す非常に強力な兆候です。他のプロセスを待つことで、本質的に多くの計算時間を無駄にするからです。計算中に並行性を使用することもできますが、それは別の議論だと思います。
注:これらのアイデアはいずれも、実際の物理計算を考慮していません。これは Erlang の強力な側面ではなく、必要な特性のタイプに応じて、おそらく C ライブラリーまたはあなたの空想を刺激するもので実行できます。
注:これが行われたケースを (特に私が行った場合を除いて) 知りません。そのため、これが適切なアドバイスであるとは保証できません。