嗯。Java在语言层面上设计的同步机制是个大败笔。没啥优点可言。C#不幸掉进同一坑里了,叹气。
失败主要是在于:
对比语言层面的synchronized语句:
synchronized (obj) { // ... }
跟假如说使用了try-with-resources语句的锁设计:
try (mylock.lock()) { // ... } // auto-unlock at the end with an implied finally clause
是不是差不多一样好用?
所以在Java 5引入java.util.concurrent.locks的库层面上的锁之后,很多人都会选择使用这个而不是用synchronized语句来实现自己需要的同步功能。可惜java.util.concurrent.locks包下的锁没有更新为使用try-with-resources功能,所以用的时候还是得自己 lock.lock(); try { ... } finally { lock.unlock(); }。
(刚发了封邮件去问OpenJDK的core-libs-dev看有没有人对try-with-resoures版API感兴趣:
A bit of sugar for j.u.c.locks with try-with-resources?等回复看看大佬们怎么说。)
考虑Java设计之初的时间背景:当时在语言层面提供完善的多线程支持的语言还没多少,Java算是探索了一种可能的设计,原本是想通过语法支持来方便多线程编程,而后来它的各种弊端才展现出来。