Lock功能强大,灵活,功能全面碾压synchronized,为什么Java官方不但没有废弃反而JDK1.6开始优化?

46 阅读2分钟

1.语法简洁性:

synchronized是Java语言内置的关键字,使用起来语法简洁。比如在方法上直接添加synchronized关键字就能实现对该方法的同步控制 ,如public synchronized void method() { // 方法体 },或者在代码块上使用synchronized(this)来同步一段代码。相比之下,Lock接口的使用较为复杂,需要先创建Lock实现类的实例(如ReentrantLock lock = new ReentrantLock();),然后在合适的地方调用lock.lock()获取锁,在finally块中调用lock.unlock()释放锁以确保锁一定被释放,防止死锁,代码量相对较多,对于简单的同步需求,synchronized的简洁性优势明显。

2.自动释放锁:

synchronized在代码执行完同步块或者方法抛出异常时,会自动释放锁。这大大降低了开发人员的编码负担,减少了因忘记释放锁而导致死锁的风险。而使用Lock接口时,如果在lock.lock()之后的代码中没有正确地在finally块中调用lock.unlock(),就很容易造成死锁,对开发人员的要求更高。

3.锁优化支持:

从JDK 1.6开始,Java官方对synchronized进行了大量优化。引入了偏向锁、轻量级锁等机制。偏向锁在没有竞争的情况下,会将锁偏向于第一个获得它的线程,减少锁获取的开销;轻量级锁在竞争较小时,通过自旋的方式避免线程进入阻塞状态,减少线程上下文切换的开销。这些优化使得synchronized在性能上有了很大提升,在很多场景下与Lock接口的性能差距缩小。

4.兼容性和稳定性:

synchronized作为Java语言长期存在的同步机制,被广泛应用在大量的Java代码中。如果废弃它,会对众多已有的代码产生巨大影响,破坏兼容性。而且经过多年的使用和优化,其稳定性得到了很好的验证,开发人员对它也比较熟悉,在一些对性能要求不是极端苛刻的场景下,使用synchronized可以快速实现同步功能,保证程序的稳定性。

综上所述,虽然Lock接口功能强大灵活,但synchronized凭借其自身在语法、自动释放锁、优化以及兼容性等方面的优势,使得Java官方不但不废弃它,反而持续对其进行优化。