栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程中的锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程中的锁

多线程中的锁 锁概念

线程安全的产生前提是多个线程并发访问一个共享数据。导致线程不安全 ,现在要把将多个线程访问共享数据的方式转化为单个线程去访问,数据一次只能被一个线程来访问,根据这种思路有了锁的概念。
锁可以理解为对一个共享数据的保护,对于同一个锁保护的共享数据来说,任何线程想要访问这个共享数据的话就必须拿到这个锁,线程只有拿到这个锁才可以对共享数据进行访问。一个锁只能被一个线程拥有,用完释放锁。

锁的分类

1.从线程是否需要对资源加锁可以分为:悲观锁、乐观锁。
2.从资源被锁定,线程是否阻塞可以分为 自旋锁。
3.多个线程并发访问同一个共享资源,也就是synchronized,可以分为无锁、偏向锁 、 轻量级锁、 重量级锁。
4.从锁的公平性进行区分,可以分为 公平锁、非公平锁。
5.从锁是否可以重复获取,可以分为 可重入锁、不可重入锁。
6.从多个线程能否获取同一把锁,可以分为 共享锁、排它锁。

悲观锁

悲观锁是基于一种悲观的态度类来防止一切数据冲突,它是以一种防御的姿态在修改数据之前把数据锁住然后再进行读写操作,在它释放锁之前任何人不能对这个加锁的数据进行操作,知道前面这个人将锁释放后下一个人才能再次对这个数据加锁然后进行操作。一般数据库的本身锁机制都是基于悲观锁的机制实现的。

乐观锁

乐观锁是对于数据冲突保持一种乐观的额态度,操作数据时不会对操作的数据进行加锁(这使得多个任务并行的对数据进行操作,只有到数据提交的时候才通过一种机制来验证数据是否冲突)。

自旋锁

自旋锁和互斥锁有点类似,但是自旋锁不会引起调用者阻塞,如果自旋锁已经被别的执行单元所保持,调用者会一直循环检查该自旋锁的保持者是否已经释放锁,所以叫自旋。

无锁

顾名思义就是没有对资源进行锁定,所有线程都能访问并修改同一块资源,但同时只有一个线程可以修改成功,CAS原理已经应用就是无锁的实现,无锁无法全面的代替锁,但是无锁在一些场景的性能很高。

偏向锁

偏向锁是指一段同步代码一直被一个线程所访问,这个线程会自动的取锁,降低了取锁时的性能消耗,在大多数情况下,锁总是被同一个线程多次获得,不存在多线程竞争,所以出现了偏向锁,其目标是在只有一个线程执行同步代码的时候能够提高性能。

轻量级锁

轻量级锁是指在偏向锁的时候,被其他的线程访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的方式尝试获取锁,不会阻塞,从而提高性能。
每个线程每次加锁和释放锁都会试图CAS去操作。

重量级锁

重量级锁是通过互斥量(Mutex)来实现的,一个线程获得锁进入代码块,在没有释放锁之前会阻塞其他未获得锁的线程。

公平锁

多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远是队列的第一位获得锁。

非公平锁

多个线程去获得锁的时候,会直接尝试获取,如果获取不到再去进入队列等待队列,如果获得锁就直接获得了。

可重入锁

指的是以线程为单位,当一个线程获得对象锁之后这个线程可以再次获取本对象锁,而其他线程是不可以的。synchronized和ReentrantLock都是可重入锁。

不可重入锁

若当前线程执行中已经获取了锁,如果再次获取该锁时,就会被阻塞,故我们以自旋锁设计一个不可重入锁。

共享锁

又称为读锁,若事务T对数据对象A加上S锁,则事务T可以读A但是不能修改A,其他事务只能再对A加上S锁,而不能加上其他锁,直到T释放A的S锁,这保证了其他事务可读A,但是再T释放A上的S锁之前不能对A进行修改。

排他锁

又称为写锁,若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能对A加任何锁,直到T释放X锁。
这保证了其他事物再T释放X锁之前不能对A进行读取和修改。

synchronized和lock的对比

1.lock是显式锁(手动开关,别忘了关锁),synchronized是隐式锁,出了用域自动释放。
2.synchronized属于系统关键字,是JDK的重量级实现,而lock是代码实现,是轻量级的实现,所以lock只有代码块锁,而synchronized有代码块锁也有方法锁。
3.使用lock锁JVM花费的时间较少,性能比较好,而且也具有很好的扩展性。

synchronized有三种应用方式
  1. 作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁;
  2. 作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁;
  3. 作用于代码块,对括号里配置的对象加锁。
synchronized下的锁的4种状态

无锁->偏向锁 -> 轻量级锁 -> 重量级锁

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/987989.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号