本课时我们主要学习 synchronized 和 Lock 的异同点,以及该如何选择。
相同点
synchronized 和 Lock 的相同点非常多,我们这里重点讲解 3 个比较大的相同点。
- synchronized 和 Lock 都是用来保护资源线程安全的。
这一点毋庸置疑,这是它们的基本作用。
- 都可以保证可见性。
对于 synchronized 而言,线程 A 在进入 synchronized 块之前或在 synchronized 块内进行操作,对于后续的获得同一个 monitor 锁的线程 B 是可见的,也就是线程 B 是可以看到线程 A 之前的操作的,这也体现了 happens-before 针对 synchronized 的一个原则。

而对于 Lock 而言,它和 synchronized 是一样,都可以保证可见性,如图所示,在解锁之前的所有操作对加锁之后的所有操作都是可见的。

如果你之前不了解什么是可见性,此时理解可能会有一定的困难,可以在学习本专栏的 Java 内存模型相关内容后,再复习本课时,就会豁然开朗。
- synchronized 和 ReentrantLock 都拥有可重入的特点。
这里的 ReentrantLock 是 Lock 接口的一个最主要的实现类,在对比 synchronized 和 Lock 的时候,也会选择 Lock 的主要实现类来进行对比。可重入指的是某个线程如果已经获得了一个锁,现在试图再次请求这个它已经获得的锁,如果它无需提前释放这个锁,而是

本文探讨了Java中synchronized和Lock的异同,包括它们的相同点如保证线程安全和可见性,以及不同点如用法、解锁顺序、灵活性和原理。文章建议在选择时,如果synchronized能满足需求则优先使用,若需要更高级功能如可中断、超时则考虑使用Lock。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



