他の回答で説明されているように、コードをアトミックにするための解決策があります。ただし、このコードがすべての状況で正しいとは限らないため、一般的な設定では、問題が解決するという保証はありません。
許可は、それらを使用するアクティビティによって解放されます。その場合、そのコードは不要です。セマフォは自然に補充されるか、そうでない場合は、そのコードが必要になり、安全である限り、変なことは何もしません。
タイムクォンタム(ここでは1分)あたりのアクティビティのレートを制限することを指定していることに注意してください。ただし、アクティビティは1分より長く続く可能性があることを考慮に入れる必要があります。ここで制限できることは、実際には2つあります。
- クォンタムごとに開始するアクティビティの数、
- クォンタムで実行されているアクティビティの数
最初のものを制限したい場合は、許可証を補充し、活動家に許可証を保持させるためのコードが必要になります。2番目のケースを処理する場合は、開始時と終了時にそれぞれ許可を取得および解放するようにアクティビティを強制する必要があります。
一部のアクティビティによるセマフォの誤用を恐れている場合は、アクティビティコード自体でのセマフォの使用を禁止してください。実際、レート制限はアクティビティのセマンティクスと完全に直交しているため、その機能をアクティビティのメインコードから分離することをお勧めします。したがって、スケジュールされたアクティビティをコードでラップして、セマフォを処理する必要があります。
class RateLimitedRunnable implements Runnable {
Runnable runnable;
RateLimitedRunnable(Runnable r) { runnable = r; }
void Run() {
semaphore.acquire();
runnable.run();
semaphore.release(); // remove if only limiting starts
}
}
上記のサンプル(テストされていない)コードは、実際のアクティビティから離れたセマフォの使用の可能な処理を説明しているため、潜在的な誤用を排除します。内部アクティビティがセマフォにアクセスする必要がある場合は、現在の状態を取得するだけで済み、アドホックインターフェイスはその制限されたアクセスを提供するように確実に設計できます。
注:セマフォの使用に関する説明はJavaのコンテキストよりも一般的であるため、ここではスレッドまたはプロセスの意味として「アクティビティ」という用語を使用します。