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

防城港市网站建设_网站建设公司_前端工程师_seo优化

成都企业模板建站,网页设计后怎么上传到网站,城市形象设计vi手册,大学网站开发实验室建设方案加锁过程中#xff0c;处理冲突的过程中#xff0c;涉及到的一些不同的处理方式。锁的策略决定了线程如何获取和释放锁以及在何种情况下阻塞和唤醒线程。 1. 常见的锁策略 1.1 乐观锁和悲观锁 乐观锁#xff1a;在加锁之前#xff0c;预估当前出现锁冲突的概率不大处理冲突的过程中涉及到的一些不同的处理方式。锁的策略决定了线程如何获取和释放锁以及在何种情况下阻塞和唤醒线程。 1. 常见的锁策略  1.1  乐观锁和悲观锁 乐观锁在加锁之前预估当前出现锁冲突的概率不大因此在进行加锁的时候不会做太多的工作于是加锁的速度就可能更快当更容易引入一些其他的问题例如肯能会消耗更多的CPU资源。悲观锁在加锁之前预估当前出现锁冲突的概率比较大因此在加锁的时候就会做更多的工作所以加锁的速度可能会更慢但是整个过程中不容易出现其他问题。 1.2 轻量级锁和重量级锁 轻量级锁加锁的开销更小加锁速度更快。轻量级锁一般就是乐观锁。重量级锁加锁的开销更大加锁速度更慢。重量级锁一般也就是悲观锁。 注意 轻量级锁和重量级锁的定义是加锁后对结果的评价而来乐观锁和悲观锁的定义是对未发生的事做出预估而来  1.3 自旋锁和挂起等待锁 自旋锁自旋锁就是轻量级锁的一种典型实现进行加锁的时候搭配一个while循环如果加锁成功则循环结束加锁失败不进入阻塞而是再次尝试。这个反复快速执行的过程就称为“自旋”。一旦其他线程释放了锁能第一时间拿到同时这样的自旋锁也是乐观锁使用自旋的前提就是预期冲突概率不大其他线程释放了锁就能第一时间拿到。如果当前加锁的线程特别多使用自旋锁则会浪费过多的CPU资源。挂起等待锁挂起等待锁就是悲观锁的一种实现同时也是重量级锁加锁失败时进入阻塞等待不会继续消耗CPU资源挂起等待的时候需要内核调度器介入这部分要完成的操作很多所以真正获取到锁的时间会更长适用于锁冲突激烈的情况。 1.4 普通互斥锁和读写锁  普通互斥锁普通互斥锁也被称为排它锁它确保在任何时刻只有一个线程可以获得锁并访问共享资源。当一个线程持有锁时其他线程需要等待锁的释放才能继续执行类似于synchronized 加锁解锁。读写锁读写锁把锁分为两种情况加读锁和加写锁。读锁和读锁之间不会出现锁冲突即允许多个线程同时读取共享资源写锁和写锁之间会出现锁冲突读锁和写锁之间会出现锁冲突。 为什么要引入读写锁 如果两个线程读同一个数据这个操作本身就是线程安全的不需要阻塞如果使用 synchronized 加锁则会阻塞对于性能有一定影响。 1.5 公平锁和非公平锁  公平锁公平锁按照请求锁的顺序分配锁资源即 “先来后到” 保证每个线程都有公平的机会获得锁。这种策略避免了线程饥饿现象但会导致额外的开销因为线程可能需要等待其他线程释放锁。非公平锁不遵守 “先来后到” 的规则所有线程都有可能获取到锁。 1.6 可重入锁和不可重入锁  可重入锁一个线程使用一把锁连续加锁两次不会产生死锁就是可重入锁如 synchronized。不可重入锁一个线程使用一把锁连续加锁两次会产生死锁则是不可重入锁。 2. synchronized 2.1 synchronized 的锁策略 synchronized 具有自适应能力 synchronized 在某些情况下是 乐观锁/轻量级锁/自旋锁 有些情况下是 悲观锁/重量级锁/挂起等待锁。 内部会自动评估当前锁冲突的激烈程度。 如果当前锁冲突的激烈程度小就处于 乐观锁/轻量级锁/自旋锁。如果当前锁冲突的激烈程度大就处于 悲观锁/重量级锁/挂起等待锁。 2.2 锁升级 当线程执行到 synchronized 的时候如果锁还是空闲的就会经历以下过程 偏向锁阶段每个锁对象中有一个偏向锁标记当这个锁对象首次被加锁时会进入偏向锁锁对象会记录下该线程的id如果下次加锁没有锁竞争并且仍然是同一个线程拿到锁这个锁仍然是偏向锁。偏向锁并不会真的加上锁由于两次都是同一个线程来获取锁所以认为没有锁竞争所以就不用真的加上锁免去了一定开销。注意如果一个锁此前都是线程1的偏向锁在某次线程1再次尝试加锁时出现了一个线程2 也尝试加锁此时这个锁会升级为轻量级锁然后再由这两个线程来竞争。但是本次加锁一定是线程1拿到锁线程2下次竞争才可能拿到锁。  轻量级锁阶段当偏向锁出现锁竞争时或者本次加锁的线程与第一次记录的不同这个锁则会升级为轻量级锁。此处是通过自旋锁的方式来实现的。  重量级锁阶段当参与锁竞争的线程达到某个阈值就会从轻量级锁升级到重量级锁。 注意锁的升级不可逆。 2.3 锁消除  锁消除也是 synchronized 中内置的优化策略。 编译器编译代码的时候如果发现这个代码不需要加锁就会取消掉这个锁。但是这个优化是比较有限的如果代码稍微复杂一些编译器是判断不了是否需要加锁的。 2.4 锁粗化  会把多个加锁代码块合成一个代码块去除了多次加锁解锁的开销。 例如 synchronized(locker) {a; } synchronized(locker) {b; } 可粗化为 synchronized(locker) {a;b; }
http://www.lebaoying.cn/news/923.html

相关文章:

  • 什么是企业网站源码做网站业务员
  • cookie做网站访问量全新的装修设计
  • 山西有哪些做网站的公司wordpress无法创建目录安装失败
  • 网站制作公司哪家专业工业设计相关网站
  • 设计好网站网站备案信息更改
  • 网站促销活动策划福州建设注册中心网站
  • phpmysql网站开发全程实例 第2版椒江网站制作
  • 网站自适应宽度营销网站设计