synchronized和Lock的区别

本文深入解析了Java中的两种同步机制:synchronized关键字和Lock接口。详细对比了两者之间的区别,包括锁的获取与释放方式、异常处理机制、锁的可重入性以及并发读操作的效率等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、synchronized


每一个对象都有一个锁(监视器)monitor
线程调用对象的synchronized方法活着访问synchronized代码块时,这个线程要先获取该对象的锁。
当一个线程正在访问一个对象的synchronized方法时,其他线程不能访问该对象的synchronized方法,因为没有该对象的锁
当一个线程正在访问一个对象的synchronized方法时,其他线程可以访问该对象的非synchronized方法,因为不需要获取该对象的锁。
不同对象具有不同的锁,两个线程可以同时访问两个不同对象的synchronized方法。
synchronized修饰class对象时,会获取该class对象的类锁,类锁是用来控制对静态变量的访问的。
两个线程不能同时访问该类的被synchronized修饰的静态方法。
两个线程可以同时分别访问该类的被synchronized静态方法和非静态方法。
因为访问静态方法获取的是类锁,访问非静态方法获取的是对象锁。
synchronized是可重入锁。
在执行synchronized方法或者synchronized代码块时,如果发生异常,JVM会自动释放当前线程占用的锁。
synchronized是java内置特性,是java语言的关键字


二、Lock


Lock不是Java语言的内置特性,而是一个用来实现同步访问的类。
Lock可以实现读锁和写锁的分离,可以实现并发读操作。
Lock可以尝试获取锁,无论有没有得到锁都会返回,而不会阻塞
Lock在获取锁的过程中可以响应中断。
Lock需要用户主动释放锁,建议在finally中释放锁。



总结来说,Lock和synchronized有以下几点不同:

  1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

  2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

  3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

  4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

  5)Lock可以提高多个线程进行读操作的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值