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

云南网站设计流程福州+网站建设+医疗

云南网站设计流程,福州+网站建设+医疗,php在网站后台建设中的优势,网络营销的理论和特点有哪些volatile有三个特性: (1)可见性 (2)不保证原子性 (3)禁止指令重排 下面我们一一介绍 (一)可见性 volatile的可见性是说共享变量只要修改,就可以被其他线…

volatile有三个特性:

(1)可见性

(2)不保证原子性

(3)禁止指令重排

下面我们一一介绍

(一)可见性

        volatile的可见性是说共享变量只要修改,就可以被其他线程感知到,这个是怎么做到的呢?

        这得从虚拟机的内存模型说起,这里直接引用《深入理解java虚拟机》书中原话:JAVA内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不是直接读写主内存中的数据。

        所以对于多线程场景的共享变量值的传递是需要通过主内存进行。也就是线程A对共享变量tmp(没有使用volatile)修改后,线程B不一定能马上感知到。需要等线程A中的工作内存同步到主内存中,线程B才能感知到。而volatile则会保证变量只要修改就会马上同步到主内存中,并且线程读取变量时也是会先从主内存中刷新变量值,以此来保证了变量的可见性。

(二)不保证原子性

        对于volatile变量,虽然线程能马上看见它的值改变,并不能保证它的运算操作是原子的,比如:

public class TestVolatile {public static volatile int count = 0;public static CountDownLatch countDownLatch = new CountDownLatch(5);public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(() -> {for (int j = 0; j < 10000; j++) {count++;}countDownLatch.countDown();}).start();}try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("count:" + count);}
}

上面这个例子执行后,如果是原子性的,那么count的值应该是50000。但实际远小于50000

因为i++本身就不是原子步骤,它实际上是i=i+1.它需要先获取i的值,然后再加1,然后再赋值给i。两个线程A,B同时获取i的值为3,然后线程A将其加1后的值4赋值给主内存。线程B这时也完成了计算同样赋值给主内存也是4。这是计算结果就少了1。

(3)禁止指令重排

        指令重排是编译器在运行时在保证单个线程内结果不变的情况下,基于性能优化考虑对指令进行重新排序

        这个先举个例子:

public static boolean initFlag = false;public static void main(String[] args) {new Thread(() -> {// 初始化完成后再设置标志位,另一个线程感知到标志位改变后,开始执行它的业务doSomeInit();initFlag = true;}).start();new Thread(() -> {while (!initFlag) {// 还没初始化则等待try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}// 认为初始化已经完成,执行它的业务}).start();}

上面这段代码并不能实际运行出我们想要的效果(因为指令重排是虚拟机编译器内部逻辑,没想到一个确实可行的例子能够触发指令重排),只是简单代替我们经常可能会出现的业务场景,一个线程等待另一个线程完成初始化逻辑后,才开始启动自己的业务逻辑。上面initFlag没有标识volatile。那么initFlag赋值操作可能会因为指令重排,先于doSomeInit初始化逻辑先完成,这样就可能导致我们的业务功能有问题。因为对于单个线程来说,虚拟机认为initFlag提前执行并没有改变所在线程的结果。所以这里需要给initFlag加上volatile标识,告诉虚拟机,这里不能进行指令重排,在initFlag操作之前的代码,也必须先于initFlag操作之前执行

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

相关文章:

  • 做外贸怎么打开国外网站什么网站资源多
  • 湛江市住房和城乡建设网站网页标准化对网站开发维护的好处
  • 免费企业网络推广网站建设网站为什么要备案
  • 织梦手机网站怎么安装教程视频教程软路由做网站
  • 中小型企业 公司网站建设wordpress文字转图插件下载
  • 慕课联盟网站开发实战成都网站开发定
  • php做网站技术国际新闻大事
  • 泰兴网站设计少儿编程证书含金量排名
  • 网站的建设运营收费是哪些启信宝
  • 个人建什么网站好shopify欧洲
  • 学网页设计需要学什么站长工具seo综合查询引流
  • 郴州做网站的wordpress主题神级
  • 网站建设方案书填写示例网站建设公司与前端
  • 教做面食的网站wordpress主题路径
  • 建设网站需要多少时间高端品牌logo
  • 网站建设策划完整方案什么可以用手机做网站
  • 图片素材网站建设做站群网站会被k吗
  • 广州做网站最好的公司业之峰装饰公司官网
  • 网站升级 html广东省自然资源厅地址
  • 任丘做网站做影视网站犯法吗
  • 做网站应下哪个软件网站要什么软件做
  • 怎么做自己的html网站网站后台 更新缓存
  • wix做的网站 网址是什么微信网站结构
  • 网站建设加工网站开发问题
  • 网站制作公司-山而网页设计视频代码
  • 唐山建设信息网站茶叶网站的建设策划书
  • 大丰网站制作阿里巴巴网站建设初衷
  • 跨境电商平台网站工作服图片大全
  • 怎样申请免费网站小程序ui设计模板
  • 买域名和服务器做自己的网站seo免费视频教程