synchronized和ReentrantLock的理解(上)
问题:
- synchronized和ReentrantLock有什么全部?
- 有人说synchronized最慢,这话靠谱吗?
回答问题:
synchronized是Java内建的同步机制,所以也有人称其为Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他获取的线程只能等待或者阻塞在那里。
注意:原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为。一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束,但是如果开发人员使用了同步,如下面的代码所示,那么运行库将确保某一线程对变量所做的更新先于对现有 synchronized 块所进行的更新,当进入由同一监控器(lock)保护的另一个 synchronized 块时,将立刻可以看到这些对变量所做的更新。类似的规则也存在于 volatile 变量上。有兴趣可以参考:Java中的ReentrantLock和synchronized两种锁定机制的对比
在Java 5以前,synchronized是仅有的同步手段,在代码中,synchronized可以用来修饰方法,也可以使用在特定的代码块上,本质上synchronized方法等同于把方法全部语句用synchronized块包起来。
ReentranLock,通常翻译为再入锁,是Java 5提供的锁实现,他的语义和synchronized基本相同。再入锁通过代码直接调用Lock()方法获取,代码书写也更加灵活。与此同时,ReentrantLock提供了很多实用方法,能够实现很多synchronized无法做到的细节控制,比如可以控制fairness,也就是公平性,或者利用定义条件等。但是,编码中也需要注意,必须明确调用unlock()方法释放,不然就会一直持有该锁。
synchronized和ReentrantLock的性能不能一概而论,早期版本synchronized在很多场景下性能相差较大,在后续版本进行了较多的改进,在低竞争场景中表现可能优于ReentrantLock。
参考:
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- 极客时间APP核心技术第十五讲| synchronized和ReentantLock有什么区别?
声明:此为原创,转载请联系作者
作者:微信公众号添加公众号-遛狗的程序员 ,或者可以扫描以下二维码关注相关技术文章。
qrcode_for_gh_1ba0785324d6_430.jpg当然喜爱技术,乐于分享的你也可以可以添加作者微信号:
WXCD.jpeg