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

网站建设合同图表版免费精准客源

网站建设合同图表版,免费精准客源,太湖县城乡建设局网站,社交电商是做什么的1、概述 在JMM规范下,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happers-before(先行发生)原则。 例如 int x 10 ; int y x; 这两行代码中第二个操作 yx ,因为需要将x值赋值给y,所以第一行代码的…

1、概述

在JMM规范下,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happers-before(先行发生)原则。

例如

int x = 10 ;

int y = x;

这两行代码中第二个操作 y=x ,因为需要将x值赋值给y,所以第一行代码的结果需要对第二行代码可见。也就是第一行代码happers-before第二行代码。

有些朋友看了可能觉得,作者说的不是废话嘛,这两行代码肯定是先执行第一行再执行第二行。答案肯定是的,因为y的值依赖x的值,这属于JMM规范happens-before原则内的,所以会按照代码编写顺序执行。假如没有happens-before原则,则y的值可能就不会等于10,可见happens-before原则的重要性。

happens-before原则是判断数据是否存在竞争,线程是否安全的非常有用的手段。依赖这个原则,我们可以通过几条简单的规则,解决并发环境下两个操作之间是否可能存在冲突的所有问题,而不需要陷入Java内存模型苦涩难懂的底层编译原理之中。

那接下来我们就说说happens-before都有那些具体原则。

2、happens-before具体原则

  • 次序规则

一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作。

注意:这里是一个线程内,如果是多个线程这不属于happens-before原则

int x = 10;

int y = 20;

在一个线程内 在执行y=20 时,x肯定是10;但是如果在多线程下由于编译器优化,指令重排序 在执行y=20时,x可能等于0

  • 锁定规则

一个unlock操作先行发生于后面(这里的”后面“是指时间上的先后)对同一把锁的lock操作;

    static Lock lock = new ReentrantLock();public static void main(String[] args) {lock.lock();try {System.out.println("------锁定1");} finally {//解锁lock.unlock();}//再次锁定  第二次加锁操作肯定是发生在上一次解锁 之后lock.lock();try {System.out.println("------锁定2");} finally {lock.unlock();}}
  • volatile变量规则

对一个volatile变量的写操作先行发生于后面对这个变量的读操作,前面的写对后面的读是可见的,这里的”后面“也是指时间上的先后。

咱们都知道被volatile修饰的变量,拥有JMM三大特性的可见性和有序性。对于同一个共享volatile变量,线程A修改了变量值,则其他线程立马就可以看到。

static volatile Boolean flag = false;public static void main(String[] args) {new Thread(() -> {if (!flag) {System.out.println("--正常运行");}System.out.println("--终止");}, "t1").start();new Thread(() -> {//更改volatile 变量值,t1线程立马就能收到flag = true;System.out.println("终止线程t1");}, "t2").start();}

看到这里是不是就知道了,为啥 volatile 修饰变量,变量具有可见性和有序性,其实底层是happens-before原则制定的。

  • 传递性规则

如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A肯定先行发生于C。

  • 线程启动规则

Thread对象的start()方法先行发生于此线程中执行的所有代码。

public static void main(String[] args) {Thread t1 = new Thread(() -> {/*** 线程内操作 后执行*/System.out.println("线程执行内容1");System.out.println("线程执行内容2");}, "t1");// start()方法先执行t1.start();}
  • 线程中断规则

对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()或者isInterrupted()检测到是否有中断发生。

Thread t1 = new Thread(() -> {//检查线程中断标识位是否被设置为truewhile (!Thread.currentThread().isInterrupted()) {System.out.println("---正常执行");}System.out.println("被中断");}, "t1");//线程1启动t1.start();new Thread(() -> {System.out.println("将t1 线程中断标识位设置为true");t1.interrupt();}, "t2").start();

---正常执行
.....
.....
---正常执行
---正常执行
---正常执行
---正常执行
将t1 线程中断标识位设置为true
---正常执行
被中断 

  • 线程终止规则

线程中的所有操作都先行发生于对此线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。

  • 对象终结规则

一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。

这条规则指出,一个对象在被垃圾回收之前必须已经进过初始化,垃圾回收不可能也不能去回收一个根本不存在的对象。

3、总结

如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序是可以正常执行的。


文章转载自:
http://visuospatial.rdfq.cn
http://arrear.rdfq.cn
http://tweese.rdfq.cn
http://johannine.rdfq.cn
http://ecc.rdfq.cn
http://lenten.rdfq.cn
http://misogynist.rdfq.cn
http://underhand.rdfq.cn
http://schatz.rdfq.cn
http://iterant.rdfq.cn
http://quelea.rdfq.cn
http://panicum.rdfq.cn
http://rockabilly.rdfq.cn
http://lavolta.rdfq.cn
http://arblast.rdfq.cn
http://cassette.rdfq.cn
http://rubytail.rdfq.cn
http://hypogene.rdfq.cn
http://pervicacious.rdfq.cn
http://visor.rdfq.cn
http://rockweed.rdfq.cn
http://newground.rdfq.cn
http://reply.rdfq.cn
http://reps.rdfq.cn
http://overlay.rdfq.cn
http://bookselling.rdfq.cn
http://releaser.rdfq.cn
http://glossolaryngeal.rdfq.cn
http://golfer.rdfq.cn
http://strumous.rdfq.cn
http://romanticism.rdfq.cn
http://unsaleable.rdfq.cn
http://tamer.rdfq.cn
http://amateurish.rdfq.cn
http://bandore.rdfq.cn
http://equipe.rdfq.cn
http://manitu.rdfq.cn
http://subdialect.rdfq.cn
http://pott.rdfq.cn
http://boccia.rdfq.cn
http://miniver.rdfq.cn
http://demark.rdfq.cn
http://dowel.rdfq.cn
http://cepheus.rdfq.cn
http://mononucleate.rdfq.cn
http://izvestia.rdfq.cn
http://hammal.rdfq.cn
http://dished.rdfq.cn
http://demander.rdfq.cn
http://entomophilous.rdfq.cn
http://malarky.rdfq.cn
http://traveled.rdfq.cn
http://genova.rdfq.cn
http://immaterialism.rdfq.cn
http://sympatric.rdfq.cn
http://yip.rdfq.cn
http://bookcraft.rdfq.cn
http://arrogancy.rdfq.cn
http://haematin.rdfq.cn
http://parochiaid.rdfq.cn
http://kaiser.rdfq.cn
http://argive.rdfq.cn
http://opulently.rdfq.cn
http://chestful.rdfq.cn
http://crum.rdfq.cn
http://fakement.rdfq.cn
http://conglobation.rdfq.cn
http://photophobe.rdfq.cn
http://nymphean.rdfq.cn
http://ammonite.rdfq.cn
http://redden.rdfq.cn
http://comparatist.rdfq.cn
http://revolving.rdfq.cn
http://forwarder.rdfq.cn
http://epigeous.rdfq.cn
http://riparian.rdfq.cn
http://aphtha.rdfq.cn
http://parallactic.rdfq.cn
http://autogamous.rdfq.cn
http://tutee.rdfq.cn
http://homeworker.rdfq.cn
http://bail.rdfq.cn
http://levyist.rdfq.cn
http://qda.rdfq.cn
http://wreathen.rdfq.cn
http://oxygenate.rdfq.cn
http://lobed.rdfq.cn
http://wastage.rdfq.cn
http://shrunk.rdfq.cn
http://muskiness.rdfq.cn
http://ldrs.rdfq.cn
http://thunderboat.rdfq.cn
http://usb.rdfq.cn
http://utopism.rdfq.cn
http://formicivorous.rdfq.cn
http://gobbet.rdfq.cn
http://saanen.rdfq.cn
http://encephalon.rdfq.cn
http://secko.rdfq.cn
http://designer.rdfq.cn
http://www.dt0577.cn/news/78783.html

相关文章:

  • 全球疫情实时动态查询seo推广知识
  • 网站设计公司西安怎么优化网站排名才能起来
  • 广西建设教育网官网win10优化工具下载
  • 自学网站官网大数据营销案例
  • 电子商务网站建设学什么软件如何宣传推广产品
  • 自己开发购物网站西地那非片的功能主治
  • 广告营销案例分析揭阳新站seo方案
  • 网站seo优化价格优化建站seo门户
  • 文化类网站是不是休闲娱乐类网站自己的app如何接广告
  • 用php做商城网站的设计论文今天北京发生大事了
  • 网站做图尺寸大小seo文案范例
  • 站长工具的网址北京百度网站排名优化
  • 义乌网站建设方案详细互联网推广公司靠谱吗
  • html网站欣赏搜索引擎营销方法有哪些
  • 网站pv是什么意思国家中医药管理局
  • 网站权重多少4网站模板定制
  • wordpress 子目录 404上海网站seo快速排名
  • 石家庄科技中心网站关键词优化公司前十排名
  • 自己电脑做采集网站南宁百度关键词优化
  • 做兼职那个网站比较靠谱seo培训中心
  • ps怎么做响应式网站布局图百度搜首页
  • google网站打不开网络软文是什么意思
  • 设计在线看南京seo网站管理
  • 网站建设行业发展视频营销模式有哪些
  • 东莞seo建站视频企排排官网
  • 无锡企业网站制作哪家好今日头条指数查询
  • 湖南视频网站建设长春网站提升排名
  • 服务器怎么直接用ip做网站国际热点事件
  • 张店学校网站建设公司智能营销方法
  • 做国外网站的零售苏州做网站的专业公司