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

网站备案号官网黄山网站建设哪家好

网站备案号官网,黄山网站建设哪家好,做平台网站产品上传,python做网站 jsp网站JMM#xff1a; Java Memory Model(Java内存模型)#xff0c;围绕着在并发过程中如何处理可见性、原子性、有序性这三个特性而建立的模型。 可见性#xff1a; JMM提供了volatile变量定义、final、synchronized块来保证可见性。  例如#xff1a;线程a在将共享变量x1写入… JMM   Java Memory Model(Java内存模型)围绕着在并发过程中如何处理可见性、原子性、有序性这三个特性而建立的模型。 可见性   JMM提供了volatile变量定义、final、synchronized块来保证可见性。  例如线程a在将共享变量x1写入主内存的时候如何保证线程b读取共享变量x的值为1这就是JMM做的事情。JMM通过控制主内存与每个线程的本地内存之间的交互来为java程序员提供内存可见性保证。 原子性   JMM提供保证了访问基本数据类型的原子性其实在写一个工作内存变量到主内存是分主要两步store、write但是实际业务处理场景往往是需要更大的范围的原子性保证所以模型也提供了synchronized块来保证。 有序性   这个概念是相对而言的如果在本线程内所有的操作都是有序的如果在一个线程观察另一个线程所有的操作都是无序的前句是“线程内表现为串行行为”后句是“指令的重排序”和“工作内存和主内存同步延迟”现象模型提供了volatile和synchronized来保证线程之间操作的有序性。 重排序   在执行程序时为了提高性能编译器和处理器常常会对指令做重排序(编译器、处理器)就是因为这些重排序所以可能会导致多线程程序出现内存可见性问题(数据安全问题)和有序性问题。  JMM是如何处理的呢  对于编译器JMM的编译器重排序规则会禁止特定类型的编译器重排序  对于处理器重排序JMM的处理器重排序规则会要求java编译器在生成指令序列时插入特定类型的内存屏障memory barriersintel称之为memory fence指令通过内存屏障指令来禁止特定类型的处理器重排序  总之一句话JMM是通过禁止特定类型的编译器重排序和处理器重排序来为程序员提供一致的内存可见性保证。  A线程具体什么时候刷新共享数据到主内存是不确定的假设我们使用了同步原语(synchronizedvolatile和final),那么刷新的时间是确定的例如线程A释放锁后会同步到主内存线程B获取锁后会同步主内存数据即“A线程释放锁--B线程获取锁”可以实现AB线程之间的通信。   java中volatile关键字的含义   http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html Java内存模型happens-before法则   The rules for happens-before are:   Program order rule. Each action in a thread happens-before every action in that thread that comes later in the program order.   Monitor lock rule. An unlock on a monitor lock happens-before every subsequent lock on that same monitor lock.   Volatile variable rule. A write to a volatile field happens-before every subsequent read of that same field.   Thread start rule. A call to Thread.start on a thread happens-before every action in the started thread.   Thread termination rule. Any action in a thread happens-before any other thread detects that thread has terminated, either by successfully return from   Thread.join or by Thread.isAlive returning false.   Interruption rule. A thread calling interrupt on another thread happens-before the interrupted thread detects the interrupt (either by having   InterruptedException tHRown, or invoking isInterrupted or interrupted).   Finalizer rule. The end of a constructor for an object happens-before the start of the finalizer for that object.   Transitivity. If A happens-before B, and B happens-before C, then A happens-before C.   ---------------------------- 什么是happens-before?   happens-before就是“什么什么一定在什么什么之前运行”也就是保证顺序性。   因为CPU是可以不按我们写代码的顺序执行内存的存取过程的也就是指令会乱序或并行运行   只有上面的happens-before所规定的情况下才保证顺序性。 为什么存在可见性问题?   简单介绍下。相对于内存CPU的速度是极高的如果CPU需要存取数据时都直接与内存打交道在存取过程中CPU将一直空闲这是一种极大的浪费妈妈说浪费是不好的所以现代的CPU里都有很多寄存器多级cache他们比内存的存取速度高多了。某个线程执行时内存中的一份数据会存在于该线程的工作存储中working memory是cache和寄存器的一个抽象这个解释源于《Concurrent Programming in Java: Design Principles and Patterns, Second Edition》§2.2.7原文Every thread is defined to have a working memory (an abstraction of caches and registers) in which to store values. 有不少人觉得working memory是内存的某个部分这可能是有些译作将working memory译为工作内存的缘故为避免混淆这里称其为工作存储每个线程都有自己的工作存储并在某个特定时候回写到内存。单线程时这没有问题如果是多线程要同时访问同一个变量呢内存中一个变量会存在于多个工作存储中线程1修改了变量a的值什么时候对线程2可见此外编译器或运行时为了效率可以在允许的时候对指令进行重排序重排序后的执行顺序就与代码不一致了这样线程2读取某个变量的时候线程1可能还没有进行写入操作呢虽然代码顺序上写操作是在前面的。这就是可见性问题的由来。   并且多个CPU之间的缓存也不保证实时同步   也就是说你刚给一个变量赋值另一个线程立即获取它的值可能拿到的却是旧值(或null)   因为两个线程在不同的CPU执行它们看到的缓存值不一样   只有在synchronized或volatile或final的性况下才能保证正确性   很多人用synchronized时只记得有lock的功能而忘记了线程间的可见性问题。  public class Test {private int n;public void set(int n) {this.n n;}public void check() {if (n ! n)throw new Exception(check Error!);} }   check()中的 n ! n 好像永远不会成立因为他们指向同一个值但非同步时却很有可能发生。   另外JMM不保证创建过程的原子性读写并发时可能看到不完整的对象   这也是为什么单例模式中著名的双重检查成例方法在Java中行不通。(但.Net的内存模型保证这一点)   当然在Java中单例的延迟加载可以用另一种方案实现(方案四)  方案一非延迟加载单例类  public class Singleton {private Singleton(){}private static final Singleton instance new Singleton();public static Singleton getInstance() {return instance;   } } 方案二简单的同步延迟加载  public class Singleton { private static Singleton instance null;public static synchronized Singleton getInstance() {if (instance null)instance new Singleton();return instance;   } } 方案三双重检查成例延迟加载    目的是避开过多的同步   但在Java中行不通因为同步块外面的if (instance null)可能看到已存在但不完整的实例。   JDK5.0以后版本若instance为volatile则可行    用volatile修饰的变量线程在每次使用变量的时候都会读取变量修改后的最新的值。volatile很容易被误用用来进行原子性操作。 public class Singleton { private static Singleton instance null;public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}}return instance;   } } 方案四类加载器延迟加载  public class Singleton { private static class Holder {static final Singleton instance new Singleton();}public static Singleton getInstance() {return Holder.instance;   } }   转载于:https://www.cnblogs.com/hujunzheng/p/5118256.html
http://www.zqtcl.cn/news/413933/

相关文章:

  • 鞍山做网站排名滁州seo
  • 加关键词的网站seo服务外包公司
  • 大丰建站研究网站建设
  • 网站建设维护教程聊城做网站推广地方
  • 郑州七彩网站建设公司怎么样国内老牌的注册代理
  • 衡水外贸网站建设临清轴承网站建设
  • 上街郑州网站建设网站管理建设的需求分析
  • 厦门网站建设策划网站推广的常用方法有哪些
  • 做电脑图标的网站上海定制网站建设公司哪家好
  • 重庆seo网站推广工具济南网页设计师招聘信息
  • 甘肃永靖建设住建局网站深圳网络广告推广公司
  • 台州企业网站搭建电话厦门学网站建设
  • 做易经网站做网站布为网
  • 高端定制开发网站可以做网站的网络
  • 局政务网站建设管理工作总结wordpress ks主题
  • 网站集约化建设的意义网页制作成app
  • 建设银行大厂支行网站专业的营销型网站建设公司
  • 询盘网站苏州建设银行招聘网站
  • 制作网站图片手机网站跳转
  • 装修公司营销网站模板东莞家居网站建设
  • 网站模板建站教程视频德州极速网站建设百家号
  • 专做蔬菜水果的网站自学it从哪里学起
  • 邵阳红网站搭建平台聚合力
  • 滁州网站建设信息推荐软件开发技术方案模板
  • 商务网站建设有哪几个步骤拼多多网页qq登录
  • 厦门商城网站开发宜昌小程序开发公司
  • 东莞沙田网站建设榆林网站建设价格
  • 无锡网站制作建设wordpress写文章模板
  • 企业网站销售提升学历要多少钱
  • 打开建设银行官方网站首页wordpress 站库分离