synchronized
一句话来解释其作用就是:能保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效。
锁分为对象锁与类锁。
我们先给出这6种常见的情况,然后一个一个分析。
1、两个线程同时访问一个对象的同步方法。--------生效
2、两个线程访问的是两个对象的同步方法。---------不生效,因为有两把锁
3、两个线程访问的是synchronized的静态方法。-----------生效,锁子是类
4、两个线程同时访问同步方法与非同步方法。-----------同步方法生效
5、一个线程访问一个类的两个普通同步方法。----------------生效
6、同时访问静态同步方法和非静态同步方法。-----------------不生效,因为有两把锁
synchronized具有可重入性与不可中断性。
缺点
一、效率低
1,锁的释放情况少
当一个线程获取到对应的Synchronized这把锁并且正在执行的时候,其他线程如果也想得到这把锁只能等待,等待当前线程去释放。但是只有两种情况下锁会得到释放,一个是该段同步代码执行完毕了,还有一个是未执行完毕但是执行的过程中抛出了异常。如果我们这把锁由于要等待IO的操作或者其他操作费了很长时间,但是有没有主动地区释放锁,其他线程只能等待,这是非常影响程序执行效率的。这个时候就需要一种机制,让这种一直在等待又影响其他线程的情况得到遏制,对于Lock,它就可以办到。
2,试图获取锁时不能设定超时
只能干巴巴地等待,无法设定超时后就不做等待。相比之下,Lock可以设置超时时间。
3,不能中断一个正在试图获取锁的线程
Lock是有中断能力的。
二、不够灵活(读写锁更灵活)
1,加锁和释放的时机单一,不能自己控制加锁和解锁的时机
加锁:锁住某个对象,那么这个对象就是这把锁
释放:释放这个对象,意味着解了这把锁
三、无法知道是否成功获取到锁
我们用Synchronized对代码加锁,我们没有办法提前知道它是成功了还是失败了,相比之下,Lock可以去尝试,如果成功了dosth1,如果没有成功dosth2。