synchronized和ReentrantLock可重入锁
1.可重入锁是什么?
可重入锁也叫作递归锁。指的是同一个线程外层函数获取到锁之后,内层递归函数仍然能获取到该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。也就是说,线程可以进入任何一个它已经拥有的锁所同步的代码块。
2.synchronized可重入锁证明
package com.example.demo;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by Administrator on 2020/7/5.
* synchronized可重入锁证明
*
* @author qtx
*/
public class LockDemo {
static synchronized void sayHello1() {
System.out.println(Thread.currentThread().getName() + "\tsayHello1:" + "hello");
sayHello2();
}
static synchronized void sayHello2() {
System.out.println(Thread.currentThread().getName() + "\tsayHello2:" + "hello");
}
public static void main(String[] args) {
new Thread(() -> {
sayHello1();
}).start();
new Thread(() -> {
sayHello1();
}).start();
}
}
3.ReentrantLock可重入锁证明
package com.example.demo;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by Administrator on 2020/7/5.
* ReentrantLock可重入锁证明
*
* @author qtx
*/
class test implements Runnable {
Lock lock = new ReentrantLock();
@Override
public void run() {
get();
}
public void get() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + "\tget:" + "hello");
set();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void set() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + "\tset:" + "hello");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class LockDemo {
public static void main(String[] args) {
test t = new test();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}