ReentrantLock实现同步

来源:互联网 发布:淘宝企业店铺费用 编辑:程序博客网 时间:2024/06/05 05:44

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() {@Overridepublic void run() {MyService.MethodA();}};Runnable runnableB = new Runnable() {@Overridepublic 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