マルチスレッドのJavaの概念は、ロックを再入することができます
記事のディレクトリ
まず、リエントラントロックは何ですか
Javaリエントラントロックは、二つ、すなわち同期ReentrantLockのロック及びその実現に分割されています。だから、それはリエントラントロックするもので、実際にはリエントラントロックがあり、すでに、独自で開催されたロックを獲得することができますスレッド。あなたができるならば、それはそれ以外の場合は再入可能ロックではありません、リエントラントロックです。その役割は、デッドロックの繰り返し取得を避けることができるようにすることです。
二、demo
1、同期
public class ReentrantSynchronizer {
public synchronized void print() {
System.out.println(Thread.currentThread().getName());
printf();
}
public synchronized void printf() {
System.out.println(Thread.currentThread().getName());
print();
}
public static void main(String[] args) {
ReentrantSynchronizer reentrantSynchronizer = new ReentrantSynchronizer();
for (;;){
reentrantSynchronizer.print();
}
}
}
上記試験は、デモリエントラントプロパティを同期され、方法は、第2の方法、第二の方法とメソッドを呼び出す、すなわち、同様の構造と呼ばれます
synchronized(this){
synchronized(this){
}
}
結果:
main
main
main
main
main
main
...
証明同期はリエントラントロックです。
2、UnReentrantLock
デモリエントラントではありませんロックの特性をシミュレートするために、ここで使用される、実際には、リエントラントJUCロックです。
public class UnReentrantLock {
private AtomicReference<Thread> owner = new AtomicReference<>();
public void lock() {
Thread current = Thread.currentThread();
for (; ; ) {
if (owner.compareAndSet(null, current)) {
System.err.println("EXIT");
return;
}
}
}
public void unlock() {
Thread current = Thread.currentThread();
owner.compareAndSet(current, null);
}
public static void main(String[] args) {
UnReentrantLock unReentrantLock=new UnReentrantLock();
unReentrantLock.lock();
//unReentrantLock.unlock();
//连续两次执行lock就会造成死锁
unReentrantLock.lock();
}
}
私たちは同じスレッド二つの連続呼び出した場合、非リエントラントロックを見ることができる上に、デッドロックが発生します。
3、ReentrantLockの
これは、JUCリエントラントロック、特定のデモテストはライン上の2つの連続したロックルック手を行くためにあなたに与えられ、そして比較的簡単です。
第三に、要約
- リエントラントロックではなく、同じスレッドの再入可能ロックオブジェクト。
- 再入可能ロックのロックを獲得するために繰り返すことができ、ロック・スレッドへのアクセスは、デッドロックが発生することはありません。
- 非リエントラントロックは、スレッドがロックを取得し、その後のリリースが、お互いのために待機していてデッドロック状態になることでしょうロックを取得します。