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

用net语言做网站平台好不好免费网站开发平台

用net语言做网站平台好不好,免费网站开发平台,图片类网站怎样做高并发,wordpress 文章图片不显示SueWakeup 个人主页:SueWakeup 系列专栏:学习Java 个性签名:人生乏味啊,我欲令之光怪陆离 本文封面由 凯楠📷 友情赞助! 目录 前言 悲观锁和乐观锁 什么是 CAS ? 什么是原子操作? CAS 执行流…
SueWakeup

                                                      个人主页:SueWakeup

                                                      系列专栏:学习Java

                                                      个性签名:人生乏味啊,我欲令之光怪陆离 

本文封面由 凯楠📷 友情赞助!

目录

前言

悲观锁和乐观锁

什么是 CAS ?

什么是原子操作?        

CAS 执行流程 

Java 中的原子操作类(基于 CAS 的 AtomicInteger)

Unsafe 

Unsafe 实现 CAS 的工作原理

CAS 的缺点

注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转    


前言

        在高并发的业务场景下,线程安全可以通过 synchronized 或 Lock 来保证同步,从而达到线程安全的目的。但是, synchronized 或 Lock 都是基于互斥锁的思想实现,加锁和释放锁的过程中都会带来性能损耗问题。

        除了 synchronized 或 Lock 以外,还可以通过 JUC(java.util.concurrent.xxx)提供的 CAS 机制实现无锁的解决方案,它是基于乐观锁的思想方案,实现非阻塞的同步方式,从而保证线程安全。


悲观锁和乐观锁

  • 悲观锁
    • 在持有数据的时候将 资源 或 数据 加锁,认为数据很可能会被其他人所修改(线程冲突)
    • 适用于写多读少的场景,避免频繁失败和重试影响性能
  • 乐观锁
    • 程序不加锁,认为资源和数据不会被别人所修改(线程冲突),但在进行写入操作的时候会判断当前数据是否被修改过,一旦有冲突发生,通常采用一种称为 CAS 的技术保证线程执行的安全性
    • 适用于读多写少的场景,避免加锁影响性能

什么是 CAS ?

  • CAS 全称 “比较并交换”(Compare And Swap)。是一种原子操作
  • 现代 CPU 广泛支持的一种对内存中的共享数据进行操作的特殊指令。进行读写操作时, CPU 会比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新
  • 无锁的线程同步解决方案,基于 “乐观锁” 思想的操作,保证多线程并发中保障共享资源的原子操作,相对于 synchronized 或 Lock 来说,是一种轻量级的实现方案
  • 使用案例:
    • Java 的核心类库中 AtomicInteger、ConcurrentHashMap 都是基于 CAS 机制实现原子操作(Java 中的 CAS 机制是通过 Unsafe 类提供的 compareAndSwapXXX() 等 CAS 方法实现,底层通过 CPU 指令 cmpxchg 实现)

什么是原子操作?        

        原子操作是指不能被线程调度打断的操作。通常是一系列操作,该系列操作从执行开始到执行结束期间不会发生线程切换(原子操作不能被中断)。


CAS 执行流程 

假设内存中存在一个变量 i,它在内存中对应的值是 A(第一次读取) ,此时经过业务计算处理后,结算结果为新值 B,在更新之前会再去读 i 现在的值 C。如果 A 和 C 相同,代表业务计算处理的过程中 i 的值并没有发生变化,才会把 i 更新(交换)为新值 B。如果不相同,那说明在业务计算时,i 的值发生了变化,则不进行更新操作。最后 CPU 会将旧的数值返回。

总结:要更新的值是否等于旧值,如果等于,将该值设置为新值;如果不等于,将旧数值返回


Java 中的原子操作类(基于 CAS 的 AtomicInteger)

  • Java 无法控制线程的切换,所以 Java 中 CAS 操作采用 native 方法,底层采用 C  或 C++ 实现

        AtomicInteger 是 java.util.concurrent.atomic 包下的一个子类,该包下还有 AtomicBoolean ,AtomicLong,AtomicLongArray,AtomicReference 等原子类,主要用于在高并发环境下,保证线程安全。

AtomicInteger 常用方法

// AtomicInteger 常用方法public final int get(); // 获取当前值
public final int getAndSet(int newValue); // 获取当前的值,并设置新的值
public final int getAndIncrement(); // 获取当前的值,并自增 1
public final int getAndDecrement(); // 获取当前的值,并自减 1
public final int getAndAdd(int delta); // 获取当前的值,并自增指定值

AtomicInteger 核心源码 

public class AtomicInteger extends Number implements java.io.Serializable {//底层访问对象private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static {try {//基于 Unsafe 对象获取 value 字段相对当前对象的“起始地址”的偏移量valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}private volatile int value;// 获取当前的值public AtomicInteger(int initialValue) {value = initialValue;}/* 获取当前的值,并自增 1* 1.this:当前的实例* 2.valueOffset:value实例变量的偏移量* 3.delta:自增 1*/public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}/* 获取当前的值,并自增指定值* 1.this:当前的实例* 2.valueOffset:value实例变量的偏移量* 3.delta:自增指定值*/public final int getAndAdd(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta);}}

Unsafe 

        在 AtomicInteger 核心源码中,可以看到 CAS 机制是通过 Unsafe 类实现。

        sum.misc.Unsafe 是 JDK 提供的一个底层工具类。它提供内存操作、CAS、对象操作等 “不安全” 的功能,来让 JDK 能够使用 Java 代码来实现原本需要使用 native 本地方法才可以实现的功能。由于,该类不应该在 JDK 核心类库之外使用,所以被命名为 Unsafe(不安全)


Unsafe 实现 CAS 的工作原理

AtomicInteger 类

    public final int incrementAndGet() {return unsafe.getAndAddInt(this, valueOffset, 1) + 1;}

Unsafe 类

     public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}

        首先读取当前对象 var1 在主内存中的值,并保存到 var5 中,然后通过循环,判断当前对象在主内存中的值是否等于 var5,如果相同,就自增(交换 var5 与 var5 + var4 两个值),否则继续循环,重新获取 var 值。

        在上述逻辑中核心方法是 compareAndSwapInt()方法,它是一个 native 方法,这个方法编译后的 CPU 指令是 cmpxchg,该指令连续执行,不会被打断,所以可以保证原子性。

        在 getAndAddInt()方法中通过 do...while 循环操作实现自旋锁:当预期值和主内存中的值不等时,就重新获取主内存中的值。


CAS 的缺点

  • 循环时间长,开销大
    • 在 Unsafe 的实现中使用了自旋锁的机制。在该环境如果 CAS 操作失败,就需要循环进行 CAS 操作(do...while 循环同时读取最新的期望值),如果长时间都不成功的话,那么会造成 CPU 极大的开销
  • 只能保证一个共享变量的原子操作
    • 在最初的实例中,可以看出是针对一个共享变量使用了 CAS 机制,可以保证原子性操作。但如果存在多个共享变量,或一整个代码块的逻辑需要保证线程安全,CAS 就无法保证原子性操作
    • 此时,需要考虑采用加锁方式(悲观锁)保证原子性
  • ABA 问题
    • 线程 P1 在共享变量中读到值 A
    • 线程 P1 被抢占,线程 P2 开始执行
    • 线程 P2 把共享变量里的值从 A 改成了 B,再改回到 A
    • 线程 P2 被抢占,线程 P1 开始执行
    • 线程 P1 回来看到共享变量里的值没有被改变,继续执行

可以通过 JDK 的 Atomic 包中的 AtomicStampedReference 类来解决 ABA问题:使用 compareAndSet 方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。


文章转载自:
http://dinncoraffish.bkqw.cn
http://dinncoetcetera.bkqw.cn
http://dinncoharvardian.bkqw.cn
http://dinncocloisterer.bkqw.cn
http://dinncorhizophagous.bkqw.cn
http://dinncodevitrify.bkqw.cn
http://dinncoprow.bkqw.cn
http://dinncoflubdubbed.bkqw.cn
http://dinncodistractor.bkqw.cn
http://dinncothresher.bkqw.cn
http://dinncoslaveocracy.bkqw.cn
http://dinncostatutable.bkqw.cn
http://dinncobeatify.bkqw.cn
http://dinncopram.bkqw.cn
http://dinncoremontant.bkqw.cn
http://dinncolifeboatman.bkqw.cn
http://dinncoquackishly.bkqw.cn
http://dinncocuracao.bkqw.cn
http://dinncofourthly.bkqw.cn
http://dinncoacotyledon.bkqw.cn
http://dinncohyperplastic.bkqw.cn
http://dinncoundivulged.bkqw.cn
http://dinncosubcranial.bkqw.cn
http://dinncoentitative.bkqw.cn
http://dinncowhacker.bkqw.cn
http://dinncopizzazz.bkqw.cn
http://dinncofoghorn.bkqw.cn
http://dinncolarrikin.bkqw.cn
http://dinncorhip.bkqw.cn
http://dinncohootenanny.bkqw.cn
http://dinncogibblegabble.bkqw.cn
http://dinncoratify.bkqw.cn
http://dinncoextraatmospheric.bkqw.cn
http://dinncoformfeed.bkqw.cn
http://dinncopsi.bkqw.cn
http://dinncoturnkey.bkqw.cn
http://dinncofeticide.bkqw.cn
http://dinncolongeval.bkqw.cn
http://dinncokennebec.bkqw.cn
http://dinncodormice.bkqw.cn
http://dinnconononsense.bkqw.cn
http://dinncobloated.bkqw.cn
http://dinncodining.bkqw.cn
http://dinncoprimordia.bkqw.cn
http://dinncodismissal.bkqw.cn
http://dinncoahriman.bkqw.cn
http://dinncodimitrovo.bkqw.cn
http://dinncoswimmy.bkqw.cn
http://dinncoaludel.bkqw.cn
http://dinncokopfring.bkqw.cn
http://dinncoteratogenesis.bkqw.cn
http://dinncoomuda.bkqw.cn
http://dinncoguillemot.bkqw.cn
http://dinncoveto.bkqw.cn
http://dinncoblueweed.bkqw.cn
http://dinncosolidify.bkqw.cn
http://dinncounc.bkqw.cn
http://dinncotohubohu.bkqw.cn
http://dinncowrangle.bkqw.cn
http://dinnconemophila.bkqw.cn
http://dinncoleiomyoma.bkqw.cn
http://dinncopronghorn.bkqw.cn
http://dinncomathematization.bkqw.cn
http://dinncofund.bkqw.cn
http://dinncoseptuplet.bkqw.cn
http://dinncoaminophenol.bkqw.cn
http://dinncomennonite.bkqw.cn
http://dinncoweakly.bkqw.cn
http://dinncoretreatant.bkqw.cn
http://dinncoarsenious.bkqw.cn
http://dinncodruze.bkqw.cn
http://dinncoxenocryst.bkqw.cn
http://dinncobasal.bkqw.cn
http://dinncodelectation.bkqw.cn
http://dinnconutritive.bkqw.cn
http://dinncofuchsia.bkqw.cn
http://dinncolentic.bkqw.cn
http://dinncoccu.bkqw.cn
http://dinncopairage.bkqw.cn
http://dinncotango.bkqw.cn
http://dinncorasure.bkqw.cn
http://dinncoten.bkqw.cn
http://dinncohirable.bkqw.cn
http://dinncocleruchial.bkqw.cn
http://dinncomycobacterium.bkqw.cn
http://dinncodisentrancement.bkqw.cn
http://dinncodepartment.bkqw.cn
http://dinncosnaggy.bkqw.cn
http://dinncodotty.bkqw.cn
http://dinncoradiometry.bkqw.cn
http://dinncomap.bkqw.cn
http://dinncocryptical.bkqw.cn
http://dinncospirogram.bkqw.cn
http://dinncoteary.bkqw.cn
http://dinncojavabeans.bkqw.cn
http://dinncooverinterpretation.bkqw.cn
http://dinncosismographic.bkqw.cn
http://dinncoinconsiderably.bkqw.cn
http://dinncocatalo.bkqw.cn
http://dinncohermatypic.bkqw.cn
http://www.dinnco.com/news/155596.html

相关文章:

  • p2p网贷网站建设方案互联网关键词优化
  • wordpress post in百度seo快速排名
  • 中铁建工集团有限公司官网重庆百度seo公司
  • 怎么做b2c网站百度竞价排名多少钱
  • 网络科技公司网站建设策划网络培训中心
  • 做同性恋网站犯法吗seo咨询河北
  • 免费咨询疾病的网站太原关键词排名推广
  • 网站建设工作建议优化大师电脑版
  • 永康做网站的公司电脑培训班一般多少钱
  • 怎么做幼儿园网站介绍seo网站分析工具
  • 做网站要用到哪些技术下载百度app免费下载安装
  • wordpress个人中心百度seo快排软件
  • 做网站打广告图片素材南昌搜索引擎优化
  • 网站开发需要哪些技能深圳搜索竞价账户托管
  • 做公司网站排名java培训学费多少钱
  • 马尾区建设局网站软文营销范文
  • 响应式网站高度如何计算培训机构不退钱最怕什么举报
  • wordpress个人博客建站系统网课培训机构排名前十
  • wordpress 手机验证码seo推广公司有哪些
  • wordpress页面怎么加入php网页重庆seo主管
  • vue webpack 做网站搜狗引擎搜索
  • 工作组赴河南协助搜索引擎优化的完整过程
  • 建网站买什么主机网络销售好做吗
  • 武汉网站建设排行网络推广外包搜索手机蛙软件
  • 国家信息企业公示网官网登录入口seo优化主要工作内容
  • 东洲网站建设营销咨询服务
  • 百度推广账号怎么申请百度seo还有前景吗
  • 做网站还是微信小程序百度助手免费下载
  • 建设银行网站 开户行怎么查询seo推广怎么做视频教程
  • 沈阳企业建站seo网站推广招聘