当前位置: 首页 > news >正文

网站内容与模板设计方案有个网站专做品牌 而且价格便宜

网站内容与模板设计方案,有个网站专做品牌 而且价格便宜,苏州公司网站建设,建一个网站需要多少钱如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:耶瞳空间 一:基本概念 使用synchronized实现线程同步,即加锁,实现的是悲观锁。加锁可以使一段代码在同一时间只有一个线程可以访问,在增加安全性的同…

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:耶瞳空间

一:基本概念

使用synchronized实现线程同步,即加锁,实现的是悲观锁。加锁可以使一段代码在同一时间只有一个线程可以访问,在增加安全性的同时,牺牲掉的是程序的执行性能。

为了在一定程度上减少获得锁和释放锁带来的性能消耗,在jdk6之后便引入了“偏向锁”和“轻量级锁”,所以Java中的锁总共有4种锁状态,级别由低到高依次为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。

锁竞争:如果多个线程轮流获取一个锁,但是每次获取锁的时候都很顺利,没有发生阻塞,那么就不存在锁竞争。只有当某线程尝试获取锁的时候,发现该锁已经被占用,只能等待其释放,这才发生了锁竞争。

在这里插入图片描述

二:无锁

无锁是指没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。

无锁的特点是修改操作会在循环内进行,线程会不断的尝试修改共享资源。如果没有冲突就修改成功并退出,否则就会继续循环尝试。如果有多个线程修改同一个值,必定会有一个线程能修改成功,而其他修改失败的线程会不断重试直到修改成功。

三:偏向锁

偏向锁,顾名思义,它会偏向于第一个访问锁的线程。如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。线程第二次到达同步代码块时,会判断此时持有锁的线程是否就是自己,如果是则正常往下执行。由于之前没有释放锁,这里也就不需要重新加锁。如果自始至终使用锁的线程只有一个,很明显偏向锁几乎没有额外开销,性能极高。

偏向锁的获取流程:

  • 查看Mark Word中偏向锁的标识以及锁标志位,若是否偏向锁为1且锁标志位为01,则该锁为可偏向状态。
  • 若为可偏向状态,则测试Mark Word中的线程ID是否与当前线程相同,若相同,则直接执行同步代码,否则进入下一步。
  • 当前线程通过CAS操作竞争锁,若竞争成功,则将Mark Word中线程ID设置为当前线程ID,然后执行同步代码,若竞争失败,进入下一步。
  • 当前线程通过CAS竞争锁失败的情况下,说明有竞争。当到达全局安全点时之前获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。

如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会释放它的偏向锁,将锁恢复到标准的轻量级锁。释放偏向锁的时候会导致STW(stop the word)操作。

偏向锁的释放流程:偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁状态的线程才会释放锁,线程不会主动去释放偏向锁。偏向锁的撤销需要等待全局安全点(即没有字节码正在执行),它会暂停拥有偏向锁的线程,撤销后偏向锁恢复到未锁定状态或轻量级锁状态。

四:轻量级锁

在轻量级锁状态下继续锁竞争,没有抢到锁的线程将自旋,即不停地循环判断锁是否能够被成功获取。长时间的自旋操作是非常消耗资源的,一个线程持有锁,其他线程就只能在原地空耗CPU,执行不了任何有效的任务,这种现象叫做忙等(busy-waiting)。如果锁竞争情况严重,某个达到最大自旋次数的线程,会将轻量级锁升级为重量级锁。

锁自旋:如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。

轻量级锁的加锁过程:

  1. 当线程执行代码进入同步块时,若Mark Word为无锁状态,虚拟机先在当前线程的栈帧中建立一个名为Lock Record的空间,用于存储当前对象的Mark Word的拷贝,官方称之为“Dispalced Mark Word”。
  2. 复制对象头中的Mark Word到锁记录中。
  3. 复制成功后,虚拟机将用CAS操作将对象的Mark Word更新为执行Lock Record的指针,并将Lock Record里的owner指针指向对象的Mark Word。如果更新成功,则执行4,否则执行5。
  4. 如果更新成功,则这个线程拥有了这个锁,并将锁标志设为00,表示处于轻量级锁状态。
  5. 如果更新失败,虚拟机会检查对象的Mark Word是否指向当前线程的栈帧,如果是则说明当前线程已经拥有这个锁,可进入执行同步代码。否则说明多个线程竞争,轻量级锁就会膨胀为重量级锁,Mark Word中存储重量级锁(互斥锁)的指针,后面等待锁的线程也要进入阻塞状态。

五:重量级锁

当线程尝试获取锁时,发现被占用的锁是重量级锁,则直接将自己挂起,等待将来被唤醒。在JDK1.6之前,synchronized会直接加重量级锁,很明显现在得到了很好的优化。

重量级锁的特点:其他线程试图获取锁时,都会被阻塞,只有持有锁的线程释放锁之后才会唤醒这些线程。

六:总结

优点缺点适用场景
偏向锁加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距如果线程间存在锁竞争,会带来额外的锁撤销的消耗适用于只有一个线程访问同步块场景
轻量级锁竞争的线程不会阻塞,提高了程序的响应速度竞争的线程如果始终得不到锁会使用自旋,消耗CPU追求响应时间,同步块执行速度非常快
重量级锁线程竞争不使用自旋,不会消耗CPU线程阻塞,响应时间缓慢追求吞吐量,同步块执行速度较长

在这里插入图片描述

http://www.yayakq.cn/news/496347/

相关文章:

  • 搜狐自助建站哪个平台好用保定网站报价
  • 网站两边广告代码免费ftp服务器空间
  • 博达网站建设网站的技术方案
  • 企业网站和信息化建设金蝶怎么做坑人的网站
  • 网站设计师工资怎样西班牙语网站设计哪家好
  • 关于电视剧的网站设计网页鲜花网站建设源代码
  • 自己做网站外包电力建设网站
  • 网站建设运营必备人员外包网有哪些
  • 外贸网站做开关行业的哪个好php企业网站模板免费下载
  • 定制网站和模板建站哪个好用wordpress 主机安装
  • 手机怎么样自己做网站广东建设工程备案网站
  • 网站中留言板怎么做如何建设物流网站
  • 兰州网站设计公司哪家最好桂林做旅游网站失败的网站
  • 绥芬河建设工程网站广告投放平台公司
  • 景翔物流网站建设公司群晖wordpress打开慢
  • 哈尔滨自助建站平台vi手册免费模板
  • 广东世纪达建设集团有限公司官方网站手机怎么创建链接网址
  • 延边省建设局网站官网东营市建设信息网站
  • 企业怎么建设网站wordpress微信发布工具
  • 东莞网站建设曼哈顿信科交互式网页设计
  • 盐城网站建设电话徐州建设工程交易网平台官网
  • 怎样建网站什么在线做动图的网站比较好
  • 网站底部链接怎么做动漫制作技术主要学什么
  • 廊坊建站ASP网站建设实训报告总结
  • 网站开发三个月能学会吗自媒体运营从入门到精通
  • 兰州网站建设科技公司wordpress站群管理系统
  • 做视频网站用什么好佛山响应式网站设计
  • wordpress小说网站模板公司注册代理免费咨询
  • thinkphp5做网站wordpress主体怎么用
  • 做科技申报看什么网站百度小说排行榜2019