这篇“Java中的volati关键字如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中的volati关键字如何使用”文章吧。volatile是java虚拟机提供的轻量级同步机制作用是: 1.保证可见性 2.禁止指令重排 3.不保证原子性JMM(java 内存模型 Java Memory Model 简称JMM) 本身是一个抽象的概念,并不在内存中真实存在的,它描述的是一组规范或者规则,通过这组规范定义了程序中各个变量(实例字段,静态字段和构成数组对象的元素)的访问方式.JMM的同步规定:
1.线程解锁之前,必须把共享变量刷新回主存2.线程加锁锁之前,必须读取主存的最新值到自己的工作空间3.加锁解锁必须是 同一把锁由于 JMM运行程序的实体是线程.而每个线程创建时免费云主机域名JMM都会为其创建一个自己的工作内存(栈空间),工作内存是每个线程的私有 数据区域.而java内存模型中规定所有的变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问,但线程的变量的操作(读取赋值等)必须在自己的工作内存中去进行,首先要 将变量从主存拷贝到自己的工作内存中,然后对变量进行操作,操作完成后再将变量操作完后的新值写回主内存,不能直接操作主内存的变量,各个线程的工作内存中存储着主内存的变量拷贝的副本,因IC不同的线程间无法访问对方的工作内存,线程间的通信必须在主内存来完成可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。通过前面的 JMM介绍,我们知道各个线程对主内存的变量的操作都是各个线程各自拷贝到自己的工作内存中进行操作,然后在写回主内存中这就可能存在一个线程a修改了共享变量X的值但还未写回主内存,又有一个线程b对共享变量X进行操作,但 此时线程a的工作内存的共享变量X对线程吧来说是不可见的,这种工作内存与主内存同步延迟的问题就造成了可见性问题原子性:某个线程在执行某项业务时,中间不可被加塞或分割,需要整体完整。要么同时成功,要么同时失败number++在多线程下是非线程安全,不是原子性操作?计算机在执行程序时,为了提高性能,编译器和处理 器常常会对指令做重排,一般分为一下三种:单线程的环境里指令重排确保最终执行的结果和代码顺序执行的结果一致处理器在进行指令重排是必须 要考虑指令之间的数据依赖性多线程的环境交替执行,由于编译器优化重排的存在,俩个线程使用变量能否保证一致性是无法确定的,无法预料的线程操作资源类,线程1访问method1,线程2访问method2,正常情况顺序执行,a=6
多线程下假设出现了指令重排,语句2在语句1之前,当执行完flag=true后,另一个线程马上执行method2,a=5所以volatile 禁止指令重排,从而避免多线程的 环境下出现执行乱序 的情况单例DCL的代码这种写法在多线程条件下可能正确率为99.999999%,但可能由于指令重排出错原因在于某一个线程执行到第一次检测,读取到instance不为null,instance引用对象可能还没有完成初始化.instance = new SingletonDemo();; 分为一下三步memory = allocate() //分配内存ctorInstanc(memory) //初始化对象instance = memory //设置instance指向刚分配的地址
2 ,3 步不存在数据依赖, 可以指令重排的执行顺序为 1 ,3 ,2,设置instance指向刚分配的地址,次数instance还没有初始化完但此时instance不为null了,若正好此时有一个线程来访问,就出现了线程安全问题所以需要添加volatile 关键字以上就是关于“Java中的volati关键字如何使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。
这篇文章主要介绍C#如何使用delegate类型设计自定义事件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用delegate类型设计自定义事件在C#编程中,除了Method和Property,任何Class都可以有自己的事件(Eve…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。