可重入锁:
指的是同一线程外层函数获得锁之后,内存递归函数仍然能获取该所的代码,在同一个线程的外层方法获取锁的时候,在进入内层方法会自动获取锁也就是说:线程可以进入任何一个它已经拥有的锁所同步着的代码块。看完官方的解释后你是不是很蒙蔽,给大家举个例子就明白了:相当于我们只要拿到我们进入家里大门的钥匙(锁)后,就可以进入各个房间,而不用在去获取各个房间的钥匙(锁)。
备注:ReentrantLock和synchronized就是一个典型的可重入锁。
(1)证明Synchronized是可重入锁。
代码如下:
package com.mszl.thread;
/**
* 功能:验证Synchronized为可重入锁
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
class user{
public synchronized void sendSms(){
System.out.println(Thread.currentThread().getName() + " 发送短信");
this.sendEmail();
}
public synchronized void sendEmail(){
System.out.println(Thread.currentThread().getName() + " 发送邮件");
}
}
public class SynchronizedDemo {
public static void main(String[] args) {
user u=new user();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
u.sendSms();
}
});
t1.start();
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
u.sendSms();
}
});
t2.start();
}
}
执行结果:
Thread-0 发送短信
Thread-0 发送邮件
Thread-1 发送短信
Thread-1 发送邮件
(2)证明ReentrantLock可重入锁。
代码如下:
package com.mszl.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 功能:验证ReentrantLock为可重入锁
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
class reent {
Lock lock = new ReentrantLock();
public void sendSms(){
lock.lock();
try{
System.out.println(Thread.currentThread().getName() + " 发送短信");
this.sendEmail();
} catch(Exception ex){
ex.printStackTrace();
} finally{
lock.unlock();
}
}
public void sendEmail(){
lock.lock();
try{
System.out.println(Thread.currentThread().getName() + " 发送邮件");
} catch(Exception ex){
ex.printStackTrace();
} finally{
lock.unlock();
}
}
}
public class ReentrantLockDemo {
public static void main(String[] args) {
reent u=new reent();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
u.sendSms();
}
});
t1.start();
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
u.sendSms();
}
});
t2.start();
}
}
执行结果:
Thread-0 发送短信
Thread-0 发送邮件
Thread-1 发送短信
Thread-1 发送邮件