地址:联系地址联系地址联系地址
电话:020-123456789
传真:020-123456789
邮箱:admin@aa.com
欢迎来到《并发王者课》,并发本溯本文是课铂该系列文章中的第14篇。
在黄金系列中,金探接口我们介绍了并发中一些问题,何说比如死锁 、中锁活锁 、并发本溯线程饥饿等问题。课铂在并发编程中 ,金探接口这些问题无疑都是何说需要解决的。所以,中锁在铂金系列文章中 ,并发本溯我们会从并发中的课铂问题出发,探索Java所提供的金探接口锁的能力以及它们是如何解决这些问题的。
作为铂金系列文章的何说第一篇,我们将从Lock接口开始介绍,中锁因为它是Java中锁的基础,也是并发能力的基础 。
在青铜系列文章中,我们介绍了通过关键字实现对方法和代码块加锁的用法 。然而,虽然非常好用 、易用,但是它的灵活度却十分有限,不能灵活地控制加锁和释放锁的时机。所以 ,为了更灵活地使用锁 ,并满足更多的场景需要 ,就需要我们能够自主地定义锁 。于是 ,就有了Lock接口 。
理解Lock最直观的方式 ,莫过于直接在JDK所提供的并发工具类中找到它,如下图所示:
可以看到,Lock接口提供了一些能力API,并有一些具体的实现,如ReentrantLock、ReentrantReadWriteLock等。
在Java并发工具类中 ,Lock接口有一些实现 ,比如 :
除了列举的两个实现外,还有一些其他实现类 。对于这些实现,暂且不必详细了解 ,后面会详细介绍。在目前阶段,你需要理解的是Lock是它们的基础 。
接下来,我们基于前面的示例代码 ,看看如何将版本的锁用Lock来实现 。
创建类WildMonsterLock并实现Lock接口,WildMonsterLock将是取代的关键 :
在实现Lock接口时 ,你需要实现它上述的所有方法 。不过 ,为了简化代码方便展示 ,我们移除了WildMonsterLock类中的等方法。
对于和方法的时候,如果你不熟悉的话,可以查看青铜系列的文章。这里需要提醒的是,在使用时务必要和是同一个监视器。
基于刚才定义的WildMonsterLock ,创建WildMonster类 ,并在方法killWildMonster中使用WildMonsterLock对象 ,从而取代synchronized.
输出结果如下:
从结果中可以看到:只有哪吒一人斩获了野怪,其他几个英雄均以失败告终 ,结果符合预期。这说明 ,WildMonsterLock达到了和一致的效果。
不过 ,这里有细节需要注意 。在使用时我们无需关心锁的释放 ,JVM会帮助我们自动完成。然而 ,在使用自定义的锁时 ,一定要使用来确保锁最终一定会被释放,否则将造成后续线程被阻塞的严重后果 。
在中 ,锁是可以重入的