ReentrantLock 也可以实现synchronized方法、代码块的同步效果。
ReentrantLock 实现同步代码如下:
1 新建一个service类
public class MyService {
private static ReentrantLock lock = new ReentrantLock();
public static void MethodA(){
lock.lock();
System.out.println("方法A正在执行1");
System.out.println("方法A正在执行2");
System.out.println("方法A正在执行3");
System.out.println("方法A正在执行4");
System.out.println("方法A正在执行5");
lock.unlock();
}
public static void MethodB(){
lock.lock();
System.out.println("方法B正在执行1");
System.out.println("方法B正在执行2");
System.out.println("方法B正在执行3");
System.out.println("方法B正在执行4");
System.out.println("方法B正在执行5");
lock.unlock();
}
}
2 新建一个测试类:
public class Test {
public static void main(String[] args) {
Runnable runnableA = new Runnable() {
@Override
public void run() {
MyService.MethodA();
}
};
Runnable runnableB = new Runnable() {
@Override
public void run() {
MyService.MethodB();
}
};
Thread threadA = new Thread(runnableA);
Thread threadB = new Thread(runnableB);
threadB.start();
threadA.start();
}
}
输出结果:
方法A正在执行1
方法A正在执行2
方法A正在执行3
方法A正在执行4
方法A正在执行5
方法B正在执行1
方法B正在执行2
方法B正在执行3
方法B正在执行4
方法B正在执行5
如果去掉service类的所有lock.unlock(); 和 lock.lock(); 运行结果如下
方法B正在执行1
方法A正在执行1
方法B正在执行2
方法A正在执行2
方法B正在执行3
方法A正在执行3
方法B正在执行4
方法A正在执行4
方法B正在执行5
方法A正在执行5
可以看到在lock.lock();和lock.unlock(); 包围的代码是同步执行的。方法MethodA和MethodB的同步代码公用一个锁 lock