syschronized和lock的区别2

三、synchronized解释

synchronized可以保证可见性、原子性。
内存可见性:
一个线程在释放syschronized锁之前,会将线程内存中的共享变量写回到主内存
一个线程在获取syschronized锁之后,会清空线程内部涉及到的共享变量,再从主内存读取
synchronized是可重入锁,为什么要有可重入锁,可重入锁的作用:
syschronized对同一个线程是可重入的,可重入的好处就是不会出现自己把自己锁死的情况,所以可重入锁的意义在于防止死锁

四、syschronized和lock的区别

synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平、绑定多个Condition.(两者皆可重入)

  1. synchronized是一个关键字 lock是一个接口是类
  2. synchronized无法获得所得状态,属于自动锁,发生异常会自动释放锁
  3. lock可以获得锁的状态,手动锁,发生异常不会自动释放要在finally里面自己手动释放
  4. synchronized是非公平锁 lock是公平锁
  5. synchronized不可中断 持有锁线程一直不释放,其他只能阻塞等待 lock可以设置时间进行放弃等待
### Java 中 `synchronized` 关键字与 `Lock` 接口的区别及用法 #### 基本概念 `synchronized` 是一种内置的关键字,用于提供简单的线程同步功能。它通过 JVM 实现,在进入受保护的代码区域之前会自动获取锁,并在退出时释放锁[^1]。 相比之下,`Lock` 是一个接口,位于 `java.util.concurrent.locks` 包下,提供了更灵活强大的锁定机制。开发者需要显式地调用其方法来获取释放锁[^2]。 --- #### 锁定方式的不同 - **隐式 vs 显式** 使用 `synchronized` 的时候,锁的操作是由 JVM 自动管理的,无需手动干预。而使用 `Lock` 接口,则需要程序员显式地调用 `lock()` 方法获取锁以及 `unlock()` 方法释放锁[^4]。 ```java // Synchronized 示例 public synchronized void increment() { count++; } // Lock 示例 private final Lock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } ``` --- #### 功能上的差异 - **可中断性** `synchronized` 不支持线程等待期间被中断的功能。如果一个线程正在等待锁,即使该线程被标记为中断状态,仍然无法终止它的等待过程[^3]。然而,`Lock` 提供了这种能力,例如通过 `tryLock(long timeout, TimeUnit unit)` 或者配合外部逻辑处理中断情况。 - **超时尝试** 利用 `Lock` 的某些实现(如 `ReentrantLock`),可以设置时间限制去尝试获得锁。如果没有成功则不会陷入死等的状态;但是 `synchronized` 并不具备这样的特性。 ```java if (lock.tryLock(10, TimeUnit.SECONDS)) { try { // 执行临界区操作... } finally { lock.unlock(); } } else { System.out.println("未能获取锁"); } ``` --- #### 性能表现 一般来说,对于简单场景下的轻量级同步需求来说,`synchronized` 能够很好地满足性能要求并简化开发流程。但在复杂多变或者高并发环境下,由于 `Lock` 更加精细可控的设计理念,可能带来更好的效率优化空间。 --- #### 编码风格的影响 采用 `synchronized` 方式的编码更加简洁明了,适合初学者快速上手。而对于那些追求极致控制权的应用程序而言,尽管基于 `Lock` API 开发相对繁琐一些,但它给予我们更多定制化选项以适应特定业务逻辑的需求。 --- #### 小结表格对比 | 特性 | `Synchronized` | `Lock` | |---------------------|----------------------------------------|-----------------------------------------| | 获取/释放 | 隐式 | 显式 | | 支持公平锁 | 否 | 是 | | 可中断 | 否 | 是 | | 超时 | 否 | 是 | | 灵活性 | 较低 | 较高 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值