[マルチスレッドの高い同時実行性] 3。マルチスレッドの同期+ ReentrantLock + CountDownLatch + CyclicBarrier + MarriagePhaser +セマフォおよびその他のロック[ドラフト]

join()メソッド:現在のスレッドにt1を追加し、t1が実行されるのを待ってからt2を開始するのと同じです。

Yield()メソッド:yieldはThreadクラスで直接呼び出すことができます。Yieldは同じレベルのスレッドに対するCPU実行権を放棄し、準備完了状態になります。同じレベルのスレッドがCPU実行権を待機していない場合、スレッドは続行します。実行します。

wait()メソッド:同期によって変更されたクリティカルセクション(同期メソッドまたは同期コードブロック)でのみ使用できます。スレッドがこのメソッドを実行すると、スレッドはロック失い、ブロック状態になります。

sleep()およびsleep(time)メソッド:現在のスレッドによって呼び出されます。呼び出されると、スレッドはスリープしますが、ロックとCPUの実行機会を失うことはなく、「WAITING」または「TIMEED_WAITING」状態になります。

notify()メソッド:「BLOCKED」状態のスレッドに、ロックを争うように通知します。

notifyAll()メソッド:「BLOCKED」状態のすべてのスレッドに、ロックを競合するように通知します。

LockSupport.park()メソッド:

LockSupport.parkNanos()メソッド:

LockSupport.parkUntil()メソッド:

LockSupport.unpark()メソッド:

CountDownLatch:

  • countDown()メソッドは、カウンターを1つデクリメントするために使用されます。これは通常、タスクを実行するスレッドによって呼び出されます。
  • await()メソッドは、メソッドを呼び出すスレッドを待機状態にします。これは通常、メインスレッドによって呼び出されます。


CyclicBarrierバリア=新しいCyclicBarrier(20);

 

synロックはオブジェクトをロックし、実際にはオブジェクトヘッダーの64ビットの2ビットバイトとロックのアップグレードをロックします。または、ロックはクラスであり、ロックのオブジェクトとロックのクラスは
3つの比較です:(T02_AtomicVsSyncVsLongAdder)

static long count2 = 0L;用synchronized
static AtomicLong count1 = new AtomicLong(0L);// 因为用了无锁操作
static LongAdder count3 = new LongAdder(); increment()方法 (这里用的分段锁) 各个数组的和为结果。也是CAS操作

 

1、synchronized:

代码见:JUC_T01_ReentrantLock1

特点:

  • 独占锁,易于操作,但是不够灵活。
  • 可重入,自动加锁和解锁。
  • 割り込みに応答できません。



2、ReentrantLock:不可重入锁

特点:

  • 排他的ロック、ロック解除、およびロック解除は手動で行う必要があります
  • 再入可能ですが、ロック後にロックを解除する必要があります。
  • 割り込みに応答できます:lock.lockInterruptibly();
  • 公平なロックを実現できます(つまり、ロックで最も長く待機したスレッドがロックを使用する権利を取得します。一般的な理解では、キュー時間が最も長い人が最初にロックを実行します)。
 



尝试锁ReentrantLock

代码见:JUC_T03_ReentrantLock3
如果没有拿到就会去执行别的线程,如果拿到了就等待执行完了再去执行别的线程。
Lock lock = new ReentrantLock();
locked = lock.tryLock(5, TimeUnit.SECONDS);
if(locked) lock.unlock();

可以被打断的锁ReentrantLock

代码见:JUC_T04_ReentrantLock4
Lock lock = new ReentrantLock();
lock.lockInterruptibly(); //可以对interrupt()方法做出响应
lock.unlock();
t2.interrupt(); //打断线程2的等待

公平锁ReentrantLock

代码见:JUC_T04_ReentrantLock5
private static ReentrantLock lock=new ReentrantLock(true); //默认是false,非公平锁 参数为true表示为公平锁(队列),请对比输出结果,默认为非公平锁.先去看队列里面有没有线程,没有直接执行,有的话先执行队列的线程。 lock.lock(); lock.unlock();


CountDownLatch:

スレッド[]スレッド=新しいスレッド[100];
CountDownLatchラッチ=新しいCountDownLatch(threads.length);
ラッチ.countDown();
ラッチ.await();

CyclicBarrier:有効期限が切れるまで待って実行します。

//ここでの20は、実行の開始を待機するスレッドの数を指定します。
CyclicBarrierをバリア=新しいCyclicBarrierを(20);
 //待機は、
 車両が指定されたデータが一杯になった後に出発しますbarrier.await();
 CyclicBarrierをバリア=新しいCyclicBarrierを(20、新しいRunnableを(){             @Override             公共ボイドラン(){                 System .out.println( "Full people、departure");             }         });上記は次ようになります。CyclicBarrierbarrier= new CyclicBarrier(20、()-> System.out.println( "Full people"));アプリケーションシナリオ:複雑な操作、1、データベース2、ネットワーク3、ファイル同時実行:異なるスレッドが異なる操作を実行します。









ReadWriteLock読み取り/書き込みロック:T10_TestReadWriteLock

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//単独拿到读锁staticLockreadLock
    = readWriteLock.readLock();
//単独拿到写锁
staticLockwriteLock = readWriteLock.writeLock();
readWriteLock.lock();
readWriteLock.unlock();

拡張:
MarriagePhaser:    セグメント化されたロック。T09_TestPhaser2    

MarriagePhaser phaser = new MarriagePhaser();
//
phaser.bulkRegister(7);
phaser.arriveAndAwaitAdvance();
phaser.arriveAndDeregister(); //スレッドを終了する回数を指定します。Unregistered -1
phaser.register(); //現在のスレッドを+1に追加し、
ブール値onAdvance(int phase、int registe Semaphore: currentlimitを書き換え

ます

//セマフォS =新セマフォ(2);
//は、いくつかのことを示すために、いくつかを書いて実行することができ、同時にtrueは公正なロック、falseは不公正なロック
Semaphore s = new Semaphore(1、true);
//-1。セマフォからロックを取得します
s.acquire(); //
セマフォからロック取得します// + 1セマフォからロックを解放します
s.release();

交換器:2つのスレッド間で交換します。ゲーム内の機器を交換しますか?

// 2つのスレッドのみが
静的Exchanger <String> exchanger = new Exchanger <>();
s = exchanger.exchange(s);を交換できます。

LockSupport:スレッドを停止します。ロックは必要ありません

//現在のスレッドはブロックされています。
LockSupport.park();
//
LockSupport.unpark(t);の実行を続行します

 

 

 

 

おすすめ

転載: blog.csdn.net/zw764987243/article/details/109764940
おすすめ