セマフォ(セマフォ)は何ですか
- JDKは、内蔵シンクロナイザは、彼がによって達成することができますされ、共通のリソース要求に対して、マルチスレッドの同時アクセス
- それが実行を取得するカウンタ、カウンタ値がライセンス制限よりも小さい場合には、ライセンスを取得することができる方法スレッドが継続すると見られ、およびリリースメソッドを呼び出すことができ、あなたはカウンタ値を1ずつ減少させることができます
一般的に使用される方法が重要
1、public Semaphore(int permits)
// 创建一个给定许可数量的信号量对象,且默认以非公平锁方式获取资源
2、public Semaphore(int permits, boolean fair)
// 创建一个给定许可数量的信号量对象,且是否公平方式由传入的fair布尔参数值决定
3、public void acquire()
// 从此信号量获取一个许可,当许可数量小于零时,则阻塞等待
4、public void acquire(int permits)
// 从此信号量获取permits个许可,当许可数量小于零时,则阻塞等待,但是当阻塞等待的线程被唤醒后发现被中断过的话则会抛InterruptedException异常
5、public void acquireUninterruptibly(int permits)
// 从此信号量获取permits个许可,当许可数量小于零时,则阻塞等待,但是当阻塞等待的线程被唤醒后发现被中断过的话不会抛InterruptedException异常
6、public void release()
// 释放一个许可
7、public void acquire(int permits)
// 释放permits个许可
原則
- 実装セマフォクラスは、それが公平か不公平であるかどうか、達成するためにAQSのシンクロナイザに基づいて共有モードAQSに基づいていますが、動作ロジックに違いがありますされています。
- シン内部サブクラス親クラスである抽象パターンFairSync公正かつ非株式モードNonfairSyncクラス
- これは2つのコンストラクタ、ライセンスの最大数のためのフェアモードを使用するかどうかの2つのパラメータを提供します。
達成するための非エクイティ・モード
- これは、取得したセマフォ非株式モードの方法を提供しnonfairTryAcquireShared
- (<0を残りの)許可ライセンス数の場合には、スピン演算子(CAS)のすべてのスレッドを作ることができます
- 残量が0未満信号(リターン残り)が負帰還されている場合、スレッドは待ち行列に進入させる(AQS)
- tryReleaseShared方法は、解放セマフォ操作を提供します
- 残りのライセンスの現在の数に加え、スピン操作量だけCAS信号
エクイタブルモード
- 公正かつ不公平なモードモードの主な違いは、セマフォの獲得のメカニズムです
- ボックスの2行のコード内の異なる場所、それがチェック待ちキューがすでに存在する場合、直接がある場合は、(戻り-1)AQS同期は待ちキューに現在のスレッドを許可します
例