二级域名解析网站专业做网站设计公司价格
news/
2025/10/4 14:57:17/
文章来源:
二级域名解析网站,专业做网站设计公司价格,辽宁大连直客部七部电话,网站播放大视频如何做在Java并发场景中#xff0c;会涉及到各种各样的锁#xff0c;比如#xff1a;高并发编程系列#xff1a;4种常用Java线程锁的特点#xff0c;性能比较、使用场景#xff0c;这些锁有对应的种类#xff1a;公平锁#xff0c;乐观锁#xff0c;悲观锁等等#xff0c;这… 在Java并发场景中会涉及到各种各样的锁比如高并发编程系列4种常用Java线程锁的特点性能比较、使用场景这些锁有对应的种类公平锁乐观锁悲观锁等等这篇文章来详细介绍各种锁的分类 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念体现了看待线程同步的不同角度在Java和数据库中都有此概念对应的实际应用。 1.乐观锁 顾名思义就是很乐观每次去拿数据的时候都认为别人不会修改所以不会上锁但是在更新的时候会判断一下在此期间别人有没有去更新这个数据可以使用版本号等机制。 乐观锁适用于多读的应用类型乐观锁在Java中是通过使用无锁编程来实现最常采用的是CAS算法Java原子类中的递增操作就通过CAS自旋实现的。 CAS全称 Compare And Swap比较与交换是一种无锁算法。在不使用锁没有线程被阻塞的情况下实现多线程之间的变量同步。java.util.concurrent包中的原子类就是通过CAS来实现了乐观锁。 简单来说CAS算法有3个三个操作数 需要读写的内存值 V。 进行比较的值 A。 要写入的新值 B。 当且仅当预期值A和内存值V相同时将内存值V修改为B否则返回V。这是一种乐观锁的思路它相信在它修改之前没有其它线程去修改它而Synchronized是一种悲观锁它认为在它修改之前一定会有其它线程去修改它悲观锁效率很低。 2.悲观锁 总是假设最坏的情况每次去拿数据的时候都认为别人会修改所以每次在拿数据的时候都会上锁这样别人想拿这个数据就会阻塞直到它拿到锁。 传统的MySQL关系型数据库里边就用到了很多这种锁机制比如行锁表锁等读锁写锁等都是在做操作之前先上锁。详情可以参考阿里P8架构师谈MySQL行锁、表锁、悲观锁、乐观锁的特点与应用 再比如上面提到的Java的同步synchronized关键字的实现就是典型的悲观锁。 3.总之 悲观锁适合写操作多的场景先加锁可以保证写操作时数据正确。 乐观锁适合读操作多的场景不加锁的特点能够使其读操作的性能大幅提升。 公平锁 VS 非公平锁 1.公平锁 就是很公平在并发环境中每个线程在获取锁时会先查看此锁维护的等待队列如果为空或者当前线程是等待队列的第一个就占有锁否则就会加入到等待队列中以后会按照FIFO的规则从队列中取到自己。 公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低等待队列中除第一个线程以外的所有线程都会阻塞CPU唤醒阻塞线程的开销比非公平锁大。 2.非公平锁 上来就直接尝试占有锁如果尝试失败就再采用类似公平锁那种方式。 非公平锁的优点是可以减少唤起线程的开销整体的吞吐效率高因为线程有几率不阻塞直接获得锁CPU不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死或者等很久才会获得锁。 3.典型应用: java jdk并发包中的ReentrantLock可以指定构造函数的boolean类型来创建公平锁和非公平锁默认,比如公平锁可以使用new ReentrantLocktrue实现。 独享锁 VS 共享锁 1.独享锁 是指该锁一次只能被一个线程所持有。 2.共享锁 是指该锁可被多个线程所持有。 3.比较 对于Java ReentrantLock而言其是独享锁。但是对于Lock的另一个实现类ReadWriteLock其读锁是共享锁其写锁是独享锁。 读锁的共享锁可保证并发读是非常高效的读写写读 写写的过程是互斥的。 独享锁与共享锁也是通过AQS来实现的通过实现不同的方法来实现独享或者共享。 4.AQS 抽象队列同步器AbstractQueuedSynchronizer简称AQS是用来构建锁或者其他同步组件的基础框架它使用一个整型的volatile变量命名为state来维护同步状态通过内置的FIFO队列来完成资源获取线程的排队工作。 concurrent包的实现结构如上图所示AQS、非阻塞数据结构和原子变量类等基础类都是基于volatile变量的读/写和CAS实现而像Lock、同步器、阻塞队列、Executor和并发容器等高层类又是基于基础类实现。 分段锁 分段锁其实是一种锁的设计并不是具体的一种锁对于ConcurrentHashMap而言其并发的实现就是通过分段锁的形式来实现高效的并发操作。 我们以ConcurrentHashMap来说一下分段锁的含义以及设计思想ConcurrentHashMap中的分段锁称为Segment它即类似于HashMapJDK7与JDK8中HashMap的实现的结构即内部拥有一个Entry数组数组中的每个元素又是一个链表同时又是一个ReentrantLockSegment继承了ReentrantLock。 当需要put元素的时候并不是对整个hashmap进行加锁而是先通过hashcode来知道他要放在那一个分段中然后对这个分段进行加锁所以当多线程put的时候只要不是放在一个分段中就实现了真正的并行的插入。 但是在统计size的时候可就是获取hashmap全局信息的时候就需要获取所有的分段锁才能统计。 分段锁的设计目的是细化锁的粒度当操作不需要更新整个数组的时候就仅仅针对数组中的一项进行加锁操作。 你可能也喜欢: Java多线程与并发系列从0到1全部合集强烈建议收藏Java多线程系列(十一)ReentrantReadWriteLock的实现原理与锁获取详解Java多线程系列(四)4种常用Java线程锁的特点性能比较、使用场景Java多线程系列(五)线程池的实现原理、优点与风险、以及四种线程池实现Java多线程系列(七)并发容器的原理7大并发容器详解、及使用场景Java多线程系列(八)ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927248.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!