sychronized和reentrantlock区别在哪里?都有什么用处?

TheDisguiser 2020-05-02 23:08:13 java常见问答 5763

一般在编写java多线程时,如果想要保证线程安全就会需要进行数据同步,而数据同步就有Synchronized和ReentrantLock这两种方式,那它们两个都有什么区别呢?一起来看看吧。

区别:

1.ReentrantLock 拥有与Synchronized相同性质的并发性和内存语义,除此之外它还有着锁投票,定时锁等候与中断锁等候等Synchronized没有的性质。

例:

线程a与b都需要对象c的锁定,假设A获取了对象c锁,B就只能等待A释放对c的锁定,

使用 synchronized ,a不释放,b就只能等下去,不能被中断。

使用ReentrantLock,a不释放的话,B就可以在等待一段时间后,中断等待,去执行别的任务。

ReentrantLock锁定获取三种方式:

·lock(), 获取锁的话就立即返回,如果其他线程持有锁,则当前线程则一直处于休眠状态,直到获取锁

· tryLock(),获取锁会立即返回true,如果其他线程持有锁,则立即返回false;

·tryLock, 获取锁立即返回true,如果别的线程持有锁,则会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;

·lockInterruptibly:获取了锁定就会立即返回,如果没有获取锁定,则线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断。

2.synchronized是实现在JVM层面上的,可以通过监控工具监控synchronized的锁定,并且,在代码执行时如果出现异常的话,JVM就会自动释放锁定,Lock就不行,lock是通过代码实现的,它要保证锁定一定会被释放,就必须将unLock()放到finally{}中

3.一般的说,在资源竞争不是太过激烈的情况下,Synchronized的性能普遍会优于ReetrantLock,但在资源竞争非常激烈的情况下,Synchronized的性能就会下降几十倍,但是ReetrantLock的性能能维持常态;

作用:

它们都是同步方法,支持一种简单的策略来防止线程干扰和内存一致性错误:意思就是,如果一个对象对多个线程可见的话,则对该对象变量的所有读取或写入都要是通过同步方法完成的。

它们两个就是要保证在同一时间最多只能有一个线程执行目标代码,以达到保证并发安全的效果。

以上就是本文的所有内容了,更多Java常见问答知识请关注我们了解详情吧。