Synchronized和lock区别是什么?
首先呢我们要知道:
synchronized是java中的一个关键字,而Lock是一个接口
synchronized的作用域是
- 用在某一个对象上,如:synchronized (this)
- 用在方法上,如:public synchronized void run() {}
- 用在类上,如:synchronized (SynchronizeDemo.class) {}、public synchronized static void method() {}
lock只能给方法上锁
注意:Lock要定义成static静态全局变量,而不能定义在这个方法里面,这样才能保证每个调用这个方法的线程用的是同一个锁,才能保证代码同步执行
synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;
而lock需要自己加锁和释放锁,如果使用不当没有unLock()去释放锁就会造成死锁。
Lock更加灵活,里面有很多的方法可以调用,例如tryLock(尝试上锁),lockInterruptibly(看看有没有被中断),lock(上锁),unlock(释放锁)等方法
通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
还有就是Lock提供了公平锁
- 公平锁:加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得。
- 非公平所:线程加锁时直接尝试获取锁,获取不到就自动到队尾等待。