java 中 synchronized 和 ReentrantLock 的加锁和解锁能在不同线程吗?如果能,如何实现?
java 中 synchronized 和 ReentrantLock 的加锁和解锁能在不同线程吗?如果能,如何实现?
答案 2023-06-21:
java 的:
这个问题,我问了一些人,部分人是回答得有问题的。synchronized 这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,synchronized 是无法实现同一把锁的加锁和解锁在不同线程。
ReentrantLock 的加锁和解锁,是在代码层面实现的,所以是可以写出这样的代码,如下:
运行结果如下:
根据运行结果可以看出,ReentrantLock 的加锁和解锁在代码层面上可以实现,但是运行会报异常。说明 ReentrantLock 不支持同一把锁的加锁和解锁能在不同线程。
综上所述:java 中 synchronized 和 ReentrantLock 的加锁和解锁不能在不同线程。
go 的:
go 的 sync.Mutex 的加锁和解锁能在不同协程吗?如果能,如何实现?
sync.Mutex 的加锁和解锁,是在代码层面实现的,所以是可以写出这样的代码,如下:
根据运行结果可以看出,sync.Mutex 的加锁和解锁在代码层面上可以实现,运行也正常。说明 sync.Mutex 支持同一把锁的加锁和解锁能在不同协程。
综上所述:go 中 sync.Mutex 的加锁和解锁能在不同线程。
总结:
java 中 synchronized 和 ReentrantLock 都是可重入锁,所以在线程上的加锁和解锁会做限制,加锁和解锁必须在同一线程,并且成对出现。
go 的 sync.Mutex 是不可重入锁,所以在协程上的加锁和解锁没做限制。加锁和解锁可以不在同一协程,但要成对出现。
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/b7f49c50035f0e5f1771df2ff】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论