synchronized与ReentrantLock

                       ##synchronized与ReentrantLock

1.同步方法与同步代码块
同步方法:所拥有的锁是该方法所属的类的对象锁,即this对象;并且锁的作用域是整个方法体,所以会导致包含一些不需要同步的代码块,引起一些死锁,
也会降低程序的运行效率;
同步代码块:所使用的锁相对自由,可以是任意的物理对象锁;并且它锁住的作用域只是需要同步的代码块,所以锁的粒度更加精确,并不会过多影响程序
运行效率,但是如果多个代码块使用同一个锁就会出现竞态情况;

2.同步方法的分类(synchronized修饰)
静态同步方法:所有静态同步方法使用的锁都是同一把锁—类对象本身;对于静态方法而言,它是归类所拥有,不管该类有多少个实例对象,在jvm中都只
有一份,它与非静态同步方法使用的是不同锁,所以不会出现竞态情况;但是一旦一个静态方法获取到了类对象锁,其他的静态方法都必须等待当前静态方法
释放锁之后才能获取锁,不管是在一个实例对象的静态方法之间还是多个实例对象的静态方法之间都要遵循这个原则,只要是同一个类的实例;
非静态同步方法:所有的非静态同步方法使用的锁也都是同一把锁—实例对象本身;在一个实例对象中,对于非静态方法而言,一旦一个非静态方法获取到
锁,其他的非静态方法必须等待当前方法释放锁才能获取锁,但是对于另一个实例对象是没有影响的,不同是实例对象所使用的锁是实例对象本身;

3.同步方法与同步代码块的区别
(1)所使用的锁不同,同步代码块使用的锁相对自由,可以是任意物理对象锁(尽量别使用引用对象,即不要使用可能会在锁的作用域中改变值的实例变量
作为锁对象,因为变量可以通过改变值从而指向其他的对象);同步方法的锁只能是this对象锁;
(2)锁的作用域不同:同步代码块的锁的粒度更加精确;同步方法的锁是锁住整个方法;
(3)synchronized修饰方式不同:synchronized通过后接大括号,大括号里就是需要同步的代码块;synchronized通过在作为方法声明的一部分;

4.ReentrantLock继承接口Lock并实现了其中的方法,是一种重入锁,能完成synchronized所有的工作:
(1)void lock():执行此方法时,如果锁处于空闲状态,当前线程将获取锁。相反,如果锁被其他线程占用,将禁用当前线程,直到当前线程获取到锁;
(2)Boolean tryLock():如果锁可以用,则获取锁并立即返回ture,否则返回false;它与lock的区别在于tryLock只是试图获取锁,如果锁不可用,不会
导致当前线程被禁用,当前线程会继续往下执行代码。而lock则是一定要获取到锁,如果锁不可用,就一直等待,在未获取到锁之前,当前线程并不会继续执行
下去;
(3)void unlock():执行此方法时,当前线程会释放锁持有的锁,锁只能由持有者释放,并且一般是在finaly中释放;如果线程不持有锁,执行该方法会
导致异常的发生;
(4)isFair():判断该锁是不是公平锁
(5)isLock():此锁是否有任意线程占用
(6)tryLock(long timeout TimeUnit unit):如果锁在给定时间内没有被另一个线程保持,则获取锁

5.非公平锁
jvm按随机,就近原则分配锁的机制;,ReentrantLock 在构造函数中提供了 是否公平锁的初始化方式,默认为非公平锁。非公平锁实际执行效率要远远超过公平锁,除非有特殊需要,否则就用非公平锁;

6.公平锁
公平锁指的是锁的分配机制是公平的,通常先对锁提出获取请求的线程会先分配到锁;

7.ReentrantLock о synchronized
(1) ReentrantLock 通过方法lock()与unlock()来进行加锁与解锁操作,与synchronized会 被 JVM 自动解锁机制不同,ReentrantLock 加锁后需要手动进行解锁。为了避免程序出 现异常而无法正常解锁的情况,使用 ReentrantLock 必须在 finally 控制块中进行解锁操 作。
(2) ReentrantLock相比synchronized的优势是可中断、公平锁、多个锁。这种情况下需要 使用ReentrantLock。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值