锁与同步的区别

同步是synchronized关键字也就是内部锁,可以在方法上或代码块上,构成同步方法和同步块,可以保证资源保证的排他性。
lock显式锁,是通过代码实现的,它比synchronized有更精确的线程语义,提供了超时获取锁,定时锁,等候和中断锁等功能,避免死锁。在竞争不是很激烈的情况下,synchronized性能优于Lock,竞争激烈的情况下synchronized的性能会下降的很快,而Lock则不会改变

==============================================================
1.Lock是一个接口,而synchronized是关键字
2.synchronized是内置语言的实现,synchronized是在虚拟机层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且,在代码执行时出现异常JVM会自动释放锁定。但是Lock不行,Lock是通过代码实现的,要保证锁一定被释放,就必须将Unlock()放在finally{}中。
3.Lock可以让等待的线程响应中断,线程可以去做别的事情;synchronized不行,等待的线程会一直等下去,不能够响应中断。
4.Lock知道是否获得锁,知道锁的状态,而Synchronized却无法办到。
5Lock可以提高多个线程进行操作的效率。

在这里插入图片描述

Java同步种类多样,不同类型的在实现机制、使用场景、性能等方面存在区别。以下是常见的分类及其区别: ### 乐观与悲观 - **乐观**:假定数据在大多数情况下不会发生冲突,因此在操作数据时不会加,而是在更新数据时检查数据是否被其他线程修改过。常见于数据库操作,如通过版本号机制实现。 - **悲观**:认为数据在操作过程中一定会发生冲突,所以在操作数据前就会加,确保同一时刻只有一个线程能操作数据。`synchronized` 关键字实现的就是悲观的一种 [^3]。 ### 独享与共享 - **独享**:也叫排他,同一时刻只允许一个线程持有该,其他线程需要等待。`synchronized` 实现的就是独享,同一时刻只有一个线程能进入被 `synchronized` 修饰的代码块或方法 [^3]。 - **共享**:同一时刻可以有多个线程同时持有该,用于读操作等场景,允许多个线程同时读取数据。 ### 公平与非公平 - **公平**:多个线程按照申请的顺序来获取,保证每个线程都有机会公平地获取。对于 Java `ReentrantLock`,可以通过构造函数指定为公平;而 `synchronized` 是一种非公平,无法使其变为公平。 - **非公平**:多个线程获取的顺序不按照申请的顺序,有可能后申请的线程比先申请的线程优先获取,可能会造成优先级反转或者饥饿现象。不过非公平的吞吐量比公平大 [^1][^5]。 ### 互斥与读写 - **互斥**:同一时刻只允许一个线程访问共享资源,保证资源的互斥访问,`synchronized` 属于互斥 [^3]。 - **读写**:将对资源的访问分为读操作和写操作,读可以被多个线程同时持有,写是排他的,同一时刻只允许一个线程持有写。 ### 可重入 可重入又名递归,同一个线程在外层方法获取后,进入内层方法会自动获取该,可一定程度避免死。`ReentrantLock` 和 `synchronized` 都是可重入。下面是 `synchronized` 实现可重入的示例代码: ```java public class ReentrantLockExample { public synchronized void setA() throws Exception { Thread.sleep(1000); setB(); } public synchronized void setB() throws Exception { Thread.sleep(1000); } } ``` ### `synchronized` 和 `Lock` 的区别 - **存在层次**:`synchronized` 是 Java 的关键字,在 JVM 层面实现;`Lock` 是一个类 [^1]。 - **的释放**:`synchronized` 以获取的线程执行完同步代码或线程执行发生异常时,JVM 会让线程释放;`Lock` 必须在 `finally` 中释放,否则容易造成线程死 [^1]。 - **的获取**:若 `A` 线程获得 `synchronized` ,`B` 线程等待,若 `A` 线程阻塞,`B` 线程会一直等待;`Lock` 有多种获取方式,可以尝试继续获取,线程不用一直等待 [^1]。 - **的状态**:`synchronized` 无法判断的状态,`Lock` 可以判断 [^1]。 - **类型**:`synchronized` 是可重入、不可中断、非公平;`Lock` 是可重入、可判断、可公平 [^1]。 - **性能**:`synchronized` 适合少量同步,`Lock` 适合大量同步 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值