前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

JAVA锁

原创
作者头像
羽毛球初学者
发布2024-10-14 22:01:21
600
发布2024-10-14 22:01:21
举报
文章被收录于专栏:JAVA基础知识

悲观锁 & 乐观锁

  • 悲观锁:认为多个线程访问同一个共享变量冲突的概率较大,会在每次访问共享变量之前都去真正加锁。Java中的 synchronized 锁 和 ReentrantLock就是悲观锁。
  • 乐观锁:认为多个线程访问同一个共享变量冲突的概率不大,并不会真的加锁,而是直接尝试访问数据。在访问的同时识别当前的数据是否出现访问冲突,如果发现并发冲突,则让返回用户错误的信息,让用户决定如何去做。Java中的CAS就是乐观锁,比较当前值(主内存中的值)与预期值(当前线程中的值,主内存中值的一份拷贝)是否一样,一样则更新,否则继续进行CAS操作。

读写锁

Java 标准库提供了 ReentrantReadWriteLock 类, 实现了读写锁。ReentrantReadWriteLock.ReadLock 类表示一个读锁, ReentrantReadWriteLock.WriteLock 类表示一个写锁。这两个对象提供了 lock / unlock 方法进行加锁解锁。读写锁就是把读操作和写操作区分对待:

  • 读加锁和读加锁之间,不互斥。
  • 写加锁和写加锁之间,互斥。
  • 读加锁和写加锁之间,互斥。

轻量级锁 & 重量级锁

  • 重量级锁:加锁机制重度依赖了 OS 提供的 mutex,存在大量的内核态用户态切换,很容易引发线程的调度。这两个操作, 成本比较高。synchronized 锁就是重量级锁。
  • 轻量级锁:轻量级锁是在无竞争的情况下使用 CAS 操作去消除同步使用的互斥量,轻量级是相对于使用操作系统互斥量来实现的重量级锁而言的。在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。如果出现两条以上的线程争用同一个锁的情况,那轻量级锁将不会有效,必须膨胀为重量级锁。

自旋锁

如果获取锁失败,立即再尝试获取锁,无限循环,直到获取到锁为止。第一次获取锁失败,第二次的尝试会在极短的时间内到来,一旦锁被其他线程释放,就能第一时间获取到锁。自旋锁是典型的轻量级锁,它没有放弃 CPU,不涉及线程阻塞和调度。但是如果锁被其他线程持有时间较长的话,就会浪费 CPU 资源。当CAS操作时,比较操作失败后就是执行的自旋等待。

可重入锁

当线程获取了锁资源后,再次尝试去获取时,直接引用计数加一,不用等待自身放弃,避免了死锁。ReentrantLock、synchronized 锁都是可重入锁。

偏向锁

偏向锁是JDK6时加入的一种锁优化机制: 在无竞争的情况下把整个同步都消除掉,连CAS操作都不去做了。这个锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁一直没有被其他的线程获取,则持有偏向锁的线程将永远不需要再进行同步。持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作(例如加锁、解锁及对Mark Word的更新操作等)。

同步锁

同步锁表示并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。在java中 synchronized 锁就是同步锁。synchronized 锁会根据线程竞争情况进行升级,升级过程为:

  • 无锁态:当对象被实例化时,没有任何线程对其进行访问,此时处于无锁状态。
  • 无锁态 - 偏向锁:当某个线程第一次访问对象时,会将该线程的ID记录在对象的标记字段中,之后该线程再次访问时,会直接获取锁,无需竞争。
  • 偏向锁 - 轻量级锁:当多个线程对同一个对象进行竞争访问时,会升级为轻量级锁。轻量级锁使用CAS(Compare and Swap)操作来进行加锁和解锁,避免了线程的阻塞和唤醒带来的开销。
  • 轻量级锁 - 重量级锁:当轻量级锁的竞争变得激烈时,升级为重量级锁。重量级锁会使用操作系统的互斥量(Mutex)来实现,包含一个等待队列,当一个线程获取了锁,其他线程需要等待锁的释放。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 悲观锁 & 乐观锁
  • 读写锁
  • 轻量级锁 & 重量级锁
  • 自旋锁
  • 可重入锁
  • 偏向锁
  • 同步锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档