概念:可重入锁
指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码
在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
也即是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块
示例代码:
package com.debuggg.test1.main4;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 作者 ZYL
* 功能描述 : 可重入锁
* 可重入锁:
* 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码
* 在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
*
* 也即是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块
*
* case 1 : synchronized就是一个典型的可重入锁
* t1 invoke sendSMS() t1线程在外层方法获取锁的时候
* t2 #######invoke sendEmail() t1在进入内层方法会自动获取锁
*
*
* case 2 : ReentrantLock也是一个典型的可重入锁
* 日期 2020-04-08 10:33
* 参数 null
* 返回值
*/
public class ReentrantLockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.sendSMS();
},"t1").start();
new Thread(() -> {
phone.sendSMS();
},"t2").start();
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println();
System.out.println();
System.out.println();
System.out.println();
new Thread(phone,"t3").start();
new Thread(phone,"t4").start();
}
}
class Phone implements Runnable {
public synchronized void sendSMS(){
System.out.println(Thread.currentThread().getName() + "\tinvoke sendSMS()");
sendEmail();
}
public synchronized void sendEmail(){
System.out.println(Thread.currentThread().getName() + "\tinvoke sendEmail()");
}
Lock lock = new ReentrantLock();
@Override
public void run() {
get();
}
public void get(){
lock.lock();
try{
System.out.println(Thread.currentThread().getName() + "\t invoke get()");
set();
}finally{
lock.unlock();
}
}
public void set(){
lock.lock();
try{
System.out.println(Thread.currentThread().getName() + "\t invoke set()");
}finally{
lock.unlock();
}
}
}
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载