可重入锁-->线程可以进入任何一个它已经拥有的 锁所同步 着的代码块.
package com.atguigu.thread.reenterlock;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 可重入锁-->线程可以进入任何一个它已经拥有的 锁所同步 着的代码块
*/
public class ReenterLockDemo
{
public static void main(String[] args)
throws Exception
{
Phone phone = new Phone();
new Thread(() -> {
phone.sendMeg();
}, "t1").start();
new Thread(() -> {
phone.sendMeg();
}, "t2").start();
TimeUnit.SECONDS.sleep(1);
System.out.println("================");
Thread t3 = new Thread(phone, "t3");
Thread t4 = new Thread(phone, "t4");
t3.start();
t4.start();
}
}
class Phone implements Runnable
{
public synchronized void sendMeg()
{
System.out.println(Thread.currentThread().getName() + "\t invoked sendMeg()");
sendmEail();
}
public synchronized void sendmEail()
{
System.out.println(Thread.currentThread().getName() + "\t #### invoked sendmEail()");
}
// ================================================
@Override
public void run()
{
get();
}
Lock lock = new ReentrantLock();
public void get()
{
lock.lock();
try
{
System.out.println(Thread.currentThread().getName() + "\t invoked get()");
set();
}
finally
{
lock.unlock();
}
}
public void set()
{
lock.lock();
try
{
System.out.println(Thread.currentThread().getName() + "\t #### invoked set()");
}
finally
{
lock.unlock();
}
}
}
执行结果如下:
t1 invoked sendMeg()
t1 #### invoked sendmEail()
t2 invoked sendMeg()
t2 #### invoked sendmEail()
================
t4 invoked get()
t4 #### invoked set()
t3 invoked get()
t3 #### invoked set()