java面试题java知识点-synchronized

synchronized  

一句话来解释其作用就是:能保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效。

锁分为对象锁与类锁。

我们先给出这6种常见的情况,然后一个一个分析。

1、两个线程同时访问一个对象的同步方法。--------生效

2、两个线程访问的是两个对象的同步方法。---------不生效,因为有两把锁

3、两个线程访问的是synchronized的静态方法。-----------生效,锁子是类

4、两个线程同时访问同步方法与非同步方法。-----------同步方法生效

5、一个线程访问一个类的两个普通同步方法。----------------生效

6、同时访问静态同步方法和非静态同步方法。-----------------不生效,因为有两把锁

synchronized具有可重入性与不可中断性。

缺点

一、效率低
1,锁的释放情况少
当一个线程获取到对应的Synchronized这把锁并且正在执行的时候,其他线程如果也想得到这把锁只能等待,等待当前线程去释放。但是只有两种情况下锁会得到释放,一个是该段同步代码执行完毕了,还有一个是未执行完毕但是执行的过程中抛出了异常。如果我们这把锁由于要等待IO的操作或者其他操作费了很长时间,但是有没有主动地区释放锁,其他线程只能等待,这是非常影响程序执行效率的。这个时候就需要一种机制,让这种一直在等待又影响其他线程的情况得到遏制,对于Lock,它就可以办到。

2,试图获取锁时不能设定超时
只能干巴巴地等待,无法设定超时后就不做等待。相比之下,Lock可以设置超时时间。

3,不能中断一个正在试图获取锁的线程
Lock是有中断能力的。

二、不够灵活(读写锁更灵活)
1,加锁和释放的时机单一,不能自己控制加锁和解锁的时机
加锁:锁住某个对象,那么这个对象就是这把锁
释放:释放这个对象,意味着解了这把锁

三、无法知道是否成功获取到锁
我们用Synchronized对代码加锁,我们没有办法提前知道它是成功了还是失败了,相比之下,Lock可以去尝试,如果成功了dosth1,如果没有成功dosth2。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值