如何给网站加二级域名,网站后台密码忘了,长沙h5网站建设,外包建设网站服务线程栈(线程的工作内存)保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候#xff0c;首先通过对象的引用找到对应在堆内存的变量的值#xff0c;然后把堆内存变量的具体值load到线程本地内存中#xff0c;建立一个变量副本#xff0c;之后线程就不再和对象…线程栈(线程的工作内存)保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候首先通过对象的引用找到对应在堆内存的变量的值然后把堆内存变量的具体值load到线程本地内存中建立一个变量副本之后线程就不再和对象在堆内存变量值有任何关系而是直接修改副本变量的值在修改完之后的某一个时刻(线程退出之前)自动把线程变量本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。下面一幅图副描述这写交互read and load 从主存复制变量到当前工作内存 use 代码中使用值assign 改变共享变量值 store and write 用工作内存数据刷新主存相关内容其中use and assign 可以多次出现但是这一些操作并不是原子性也就是 在read load之后如果主内存count变量发生修改之后线程工作内存中的值由于已经加载不会产生对应的变化所以计算出来的结果会和预期不一样总结关键字上使用voildate之后每一次use之前一定要read和load这样就保证了可见性其他线程指令重排序总结jvm会对指令执行的顺序进行优化这样是为了提高执行的效率。但是在单线程的情况下指令的执行先后没有关系但是在多线程的情况下这些指令的执行顺序就是对其他线程产生很大的影响。很多介绍JVM并发的书或文章都会谈到JVM为了优化性能采用了指令重排序但是对于什么是指令重排序为什么重排序会优化性能却很少有提及其实道理很简单假设有这么两个共享变量a和b:private int a;private int b;在线程A中有两条语句对这两个共享变量进行赋值操作:a 1;b 2;假设当线程A对a进行复制操作的时候发现这个变量在主内存已经被其它的线程加了访问锁那么此时线程A怎么办等待释放锁不等待太浪费时间了它会去尝试进行b的赋值操作b这时候没被人占用因此就会先为b赋值再去为a赋值那么执行的顺序就变成了:b 2;a 1;对于在同一个线程内这样的改变是不会对逻辑产生影响的但是在多线程的情况下指令重排序会带来问题看下面这个情景:在线程A中:context loadContext();inited true;在线程B中:while(!inited ){sleep}doSomethingwithconfig(context);假设A中发生了重排序:inited true;context loadContext();那么B中很可能就会拿到一个尚未初始化或尚未初始化完成的context,从而引发程序错误。想到有一条古老的原则很适合用在这个地方那就是先要保证程序的正确然后再去优化性能。此处由于重排序产生的错误显然要比重排序带来的性能优化要重要的多。要解决重排序问题还是通过volatile关键字volatile关键字能确保变量在线程中的操作不会被重排序而是按照代码中规定的顺序进行访问同时使用synchronized 关键字里面也不会进行指令重排序。