14

私が取り組んでいるプロジェクトは、いくつかの作業を行うためにさまざまな非同期ジョブをトリガーします。さらに詳しく調べてみると、これらの非同期ジョブは実際には個別のJVM(個別のJavaプロセス)として実行されています。これらのプロセス間で同期する必要がある場合、次のいずれも使用できないということですか?

  • 同期されたメソッド/ブロック
  • 実装するすべてのロックjava.util.concurrent.locks

私にはそれらはすべてスレッドレベルであるように思われるので?

Javaは、プロセス間のセマフォのようなIPCのサポートを提供しますか?

4

5 に答える 5

14

それは正しい。標準の同期メカニズムは 1 つの JVM で動作するため、使用できません。

ソリューション

  1. Java 7 で導入されたファイル ロックを使用できます。
  2. データベース エンティティを介して同期を使用できます。
  3. Terracota のような既に実装されているソリューションの 1 つが役立つ場合があります
  4. 設計を再考してください。あなたが Java の世界の初心者である場合は、より経験豊富なエンジニアと詳細に話してみてください。あなたの質問は、あなたが間違った方向に進んでいることを示しています。
于 2012-05-16T16:31:26.653 に答える
7

synchronizedキーワード、ロック、アトミック オブジェクトなどを使用できますが、それらは JVM に対してローカルです。したがって、同じプログラムを実行している 2 つの JVM がある場合でも、同じsynchronizedメソッドを同時に実行できます。各 JVM で 1 つずつ実行できますが、それ以上は実行できません。

ソリューション:

于 2012-05-16T16:32:31.520 に答える
1

Redissonが提供する分散ロックを使用して、異なる JVM の作業を同期しています

于 2016-08-27T08:29:48.297 に答える
0

それらはすべてスレッドレベルですか?

そうです、synchronizedなどは単一のプロセスのコンテキスト内でのみ機能します。

Java は、プロセス間の IPC のようなセマフォをサポートしていますか?

Java プロセス間の通信を実装する 1 つの方法は、RMIを使用することです。

于 2012-05-16T16:31:32.897 に答える
0

ファイルを使用して Java IPC Lock 実装を実装しました: FileBasedLockおよび共有 DB (jdbc) を使用して IPC Semaphore 実装を実装しました: JdbcSemaphore。どちらの実装もspf4jの一部です。

Zookeeper インスタンスがある場合は、Apache Curatorの Zookeeper ベースの Lock レシピを参照してください。

于 2016-08-23T00:43:20.473 に答える