美文网首页
Lock、synchronized、Atomic的区别

Lock、synchronized、Atomic的区别

作者: 陈大吼 | 来源:发表于2020-12-11 22:32 被阅读0次

(1)ReentrantLock拥有Synchronized相同的并发性和内存语义,两者都是可重入的锁;Lock的实现依赖于cpu级别的指令控制,Synchronized的实现主要由JVM实现控制
(2)synchronized不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定;但是使用Lock则不行,lock是通过代码实现的,要人为保证锁定一定会被释放,就必须将unLock()放到finally{}中,否则可能造成死锁现象
(3)synchronized不是可中断锁,而ReentrantLock是可中断锁。Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
(4)通过ReentrantLock可以知道有没有成功获取锁,而synchronized却无法办到。
(5)synchronized是非公平锁,而ReentrantLock默认实现是非公平锁,但提供公平锁的实现;
(6)ReentrantLock提供读写两种锁操作;
(5)在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,原因在于,编译程序通常会尽可能的进行优化synchronized,另外可读性非常好;
但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。
(6)Atomic: 和上面的类似,不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。

概念

可重入锁:可重入锁是指同一个线程可以多次获取同一把锁。
可中断锁:是指线程尝试获取锁的过程中,是否可以响应中断。
公平锁:是指多个线程同时尝试获取同一把锁时,获取锁的顺序按照线程达到的顺序,而非公平锁则允许线程“插队”。

性能比较:

JDK1.5中,synchronized的性能是比较低的,线程阻塞和唤醒由操作系统内核完成,频繁的加锁和放锁导致频繁的上下文切换,造成效率低下;因此在多线程环境下,synchronized的吞吐量下降的非常严重。但在JDK1.6时对synchronized进行了很多优化,包括偏向锁、自适应自旋、轻量级锁等措施
当需要以下高级特性时,才应该使用Lock:可定时的、可轮询的与可中断的锁获取操作,公平队列,或者非块结构的锁。否则,请使用synchronized。

所以,我们写同步的时候,优先考虑synchronized,如果有特殊需要,再进一步优化。ReentrantLock和Atomic如果用的不好,不仅不能提高性能,还可能带来灾难。

synchronized关键字会让没有得到锁资源的线程进入BLOCKED状态,而后在争夺到锁资源后恢复为RUNNABLE状态,这个过程中涉及到操作系统用户模式和内核模式的转换,代价比较高。
尽管JAVA 1.6为synchronized做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度,但是在转变为重量级锁之后,性能仍然比较低。

所以针对计数情况,我们就可以使用java中的“原子操作类”。

相关文章

网友评论

      本文标题:Lock、synchronized、Atomic的区别

      本文链接:https://www.haomeiwen.com/subject/mjjrwktx.html