驻马店做网站优化旅游网站建设策划书模板
news/
2025/9/30 4:23:37/
文章来源:
驻马店做网站优化,旅游网站建设策划书模板,国外 设计公司手机网站,搜索广告排名前言 锁的策略#xff1a;加锁过程中#xff0c;即处理冲突的过程中#xff0c;需要涉及到的一些不同的处理方式#xff08;此处锁策略并不是java独有的#xff09;#xff0c;本篇内容主要是讲解一下关于锁的相关知识点#xff1b;
1. 关于锁的分组 1.1 第一组#x…前言 锁的策略加锁过程中即处理冲突的过程中需要涉及到的一些不同的处理方式此处锁策略并不是java独有的本篇内容主要是讲解一下关于锁的相关知识点
1. 关于锁的分组 1.1 第一组乐观锁和悲观锁
------这是两种不同的锁的实现方式 乐观锁在加锁之前预估当前出现锁冲突的概率不大因此在进行加锁的时候不会做太多的工作。加锁过程中做的事情比较少加锁的速度可能更快但是更容易引入一些其他的问题即可能会消耗更多的cpu资源 悲观锁在加锁之前预估当前出现锁冲突的概率比较大因此在进行加锁的时候会做更多的工作因为做的事情更多所以加锁的速度回更慢但是整个过程中不容易出现其他的问题。
1.2 第二组轻量级锁和重量级锁 轻量级锁加锁的开销更小加锁的速度更快---轻量级锁一般都是乐观锁 重量级锁加锁的开销更大加锁的速度更慢---轻量级锁一般都是悲观锁 轻量重量是加锁之后对结果的评价悲观乐观是加锁之前对未来的事情进行的预估,根据整体来说这两种角度描述的都是同一个事情
1.3 第三组自旋锁和挂起等待锁 自旋锁是轻量级锁的一种典型实现加锁的时候如果加锁失败不会就此阻塞放弃cpu而是相当于添加一个while循环不停的进行锁竞争这次锁竞争失败了就再次进入循环竞争锁直到加锁成功才退出循环。 这种反复快速的执行就称为 “自旋”故此自旋锁也是乐观锁使用自旋锁的前提是预期锁冲突概率不大只要其他线程释放了锁它就能第一时间加锁成功但如果有很多线程要加锁就必要使用自旋锁了因为会浪费cpu资源。 等待挂起锁是重量级锁的一种典型体现也是悲观锁加锁的时候如果加锁失败就会等待一段时间这段时间它不会去进行加锁操作和别的线程锁竞争故此就能把一些cpu资源让出来被让出来的这些cpu资源可以干一些其他事情等一段时间过后会再次尝试加锁如果失败还是重复以上工作直到最后成功拿到锁 当等待挂起的时候会有内核调度器介入所以就需要完成的操作就多了从而要获取锁的时间花费也更多一些。 Qjava中的synchronized算以上锁的哪种情况 Asynchronized具有自适应能力且synchronized在某些情况下是乐观锁轻量级锁自旋锁但是在某些情况下时悲观锁重量级锁等待挂起锁当然系统内部会自动的评估当前锁冲突的激烈程度 如果当前锁冲突的激烈程度不大就处于乐观锁\轻量级锁\自旋锁 如果当前锁冲突的激烈程度很大就处悲观锁锁\重量级锁\等待挂起锁 1.4 第四组 普通互斥锁和读写锁 普通互斥锁类似synchronized这种操作涉及到加锁、解锁 读写锁这里加锁的情况分为两种加读锁加写锁 读锁和读锁之间不会出现锁冲突不会阻塞写锁和写锁之间会涉出现锁冲突会阻塞读锁和写锁之间会出现锁冲突会阻塞当一个线程加读锁时另一个线程只能读不能写当一个线程加写锁时另一个线程不能写也不能读 Q:为啥要引入读写锁 A: 如果两个线程读本身就是线程安全的不需要进行互斥 如果使用synchronized这种方式加锁两个线程读与会产生互斥阻塞对于性能有一定的损耗完全给读操作不加锁就怕连个线程一个是读线程一个是写线程这样更加会涉及锁冲突如上所述读写锁能很好地解决上述的问题 java标准库中也提供了专门的类来实现读写锁读写锁本质上还是系统提供的读写锁系统提供apijvm中将api进行封装给我们使用注意synchornized不是读写锁
1.5 第五组公平锁和非公平锁 此处的公平即遵循先来后到的规则才是公平 公平锁如果线程和线程之间锁竞争的时间大小不一样按照锁竞争时间久的线程先拿到锁有先后顺序先来后到的意思 非公平锁线程和线程之间没有拿锁顺序随机调度各凭各的本事拿锁。 这里使用公平锁就能很好的解决线程饿死的这一问题。而要想实现公平锁就需要引入额外的数据结构引入队列记录每个线程的先后顺序才能实现公平锁。
1.6 第六组可重入锁和不可重入锁 可重入锁如synchronized加锁一段代码锁里面可以再进行一次加锁锁里面可以嵌套多个锁里面是用计数器这种方式对加锁的数量进行计数并判断是否解锁是可重入锁。 不可重入锁系统自带的锁不能连续加锁两次。
1.7 synchronized和Linux基于特定锁的简单比较 下面来说明一下synchronized和系统自带的锁的具体锁 synchronized乐观锁 / 悲观锁自适应 轻量级锁 / 重量级锁自适应 自旋锁 / 挂起等待所自适应 不是读写锁 非公平锁 可重入锁
linux提供的mutex系统自带的锁 悲观锁 重量级锁 挂起等待所 不是读写锁 非公平锁 不可重入锁 2. 细说synchronized的自适应 Synchronized的加锁过程自适应如下所述 当线程执行到synchronized的时候如果这个对象处于未加锁的状态就会经历一下的过程
2.1 锁升级 1、偏向锁阶段 核心思想“懒汉模式”就是能不加锁就不加锁所谓的偏向锁并不是真的加锁了只是做了个非常轻量的标记。 一旦有线程来竞争这个锁持有偏向锁的线程能第一时间拿到这个锁如果没有其他线程竞争锁下次还是拿到锁的线程大概率还是持有偏向锁的线程。 总的来说当有锁竞争的情况下偏向锁没有提高效率在没有锁竞争的情况下偏向锁就能大幅度的提高效率了。 这个标记是锁里面的一个属性每个锁都有自己的标记当锁对象首次加锁是没有涉及到锁竞争这个阶段就是偏向锁阶段一旦涉及到锁竞争就会升级成轻量级锁阶段。 2、轻量级锁阶段 此处的轻量级锁就是通过自旋的方式实现的。假设有锁竞争但不多的时候就会处于轻量级锁阶段它的优势当其他线程释放锁了处于轻量级锁阶段的线程能第一时间拿到锁劣势比较消耗cpu资源因为是自旋的方式实现的会有个循环一直尝试拿锁。 当线程多了轻量级锁就不合适了每个线程都循环尝试拿锁但如果已经有线程拿到锁了其他线程要阻塞等待但等待的这过程是会有循环不断的尝试拿锁这里消耗的cpu资源就很多了。这时就会从轻量级锁阶段升级成重量级锁阶段。 3、重量级锁阶段 此处的重量级锁是用挂起等待的方式实现的当有很多线程同时去竞争这个锁时有个线程拿到锁了其他线程没拿到就会阻塞等待等待一段时间再去尝试拿锁不成功再阻塞等待一段时间循环以上步骤如此就会让出cpu的资源可以利用这些cpu资源干一些其他的事。 注意当前版本此处只能升级不能降级。 2.2 锁消除 锁消除是synchronized的内部优化 有时候有些代码可以一眼看上去就不用加锁但是代码加锁了这时候编译器就会把这个锁给消除掉毕竟加锁操作也是要消耗一些硬件资源的。 注意锁消除和偏向锁的区别 锁消除针对能够一眼就看出不涉及到线程安全问题的代码编译器能够把锁给消除掉。 偏向锁是已经运行代码了才知道没有锁竞争。
2.3 锁粗化 通常情况下我们更偏好于让锁更细一些这样更有利于并发编程的时候解决线程安全问题但有时候让锁更粗写能提高效率会希望锁粗点。 锁粗化把多个细粒度的锁合并成一个粗粒度的锁。如下图所示 一段代码中频繁的加锁解锁肯定会消耗更多的硬件资源但是如果能把一段代码的多个加锁、解锁操作优化成只有一次加锁、解锁这样也能提高效率。
ps关于多线程中锁策略的内容就到这里了如果对你有所帮助的话就请一键三连哦
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922460.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!