マルチスレッドロック中間進化06
ロック
JDK5.0以降、Javaはより強力なスレッド同期メカニズムを提供します。同期は、同期ロックオブジェクトを明示的に定義することで実現されます。Lockオブジェクトを同期的に使用する
java.util.concurrent.locks.lockインターフェースは、複数のスレッドを制御して共有リソースにアクセスするためのツールです。ロックは、共有リソースへの排他的アクセスを提供します。一度に1つのスレッドのみがLockオブジェクトをロックでき、スレッドは共有リソースへのアクセスを開始します。最初にLockオブジェクトを取得する必要があります
ReentrantLockクラスは、再入可能ロックであるLockを実装します。同期と同じ同時実行性とメモリセマンティクスを備えています。スレッドセーフ制御の実現では、RenntrantLockが一般的に使用され、明示的にロックおよび解放できます。
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
TestLock2 testLock2 = new TestLock2();
Thread t1 = new Thread(testLock2,"a");
Thread t2 = new Thread(testLock2,"b");
t1.start();
t2.start();
}
}
class TestLock2 implements Runnable {
int ticketNum = 10;
boolean flag =true;
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (flag) {
try {
lock.lock();
if (ticketNum > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticketNum--);
} else{
flag=false;
break;}
} finally {
lock.unlock();
}
}
}
}
同期とロックの違い
ロックは明示的なロック(手動で開いたり閉じたり、閉じたり閉じたりすることはできません)、同期は暗黙的なロックですが、自動解放の範囲を除きます
ロックにはコードブロックロックのみがあり、同期にはコードブロックロックとメソッドロックがあります
Lockを使用すると、JVMはスレッドのスケジューリングに費やす時間が短縮され、パフォーマンスとスケーラビリティが向上します。
限定使用シーケンスロック>同期コードブロック>同期方法