首页 未命名正文

linux编程_线程与内存交互操作

云返利网 未命名 2020-05-26 09:08:33 13 0

线程与内存交互操作 
 

        所有的变量(实例字段,静态字段,组成数组工具的 元素,不包括局部变量和方式参数)都存储在主内存中,每个线程有自己的事情内存,线程的事情内存保留被线程使用到变量的主内存副本拷贝。线程对变量的所有操作都必须在事情内存中举行,而不能直接读写主内存的变量。差别线程之间也不能直接接见对方事情内存中的变量,线程间变量值的通报通过主内存来完成。 

Java内存模子界说了八种操作

  • lock(锁定):作用于主内存的变量,它把一个变量标识为一个线程独占的状态
  • unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  • read(读取):作用于主内存的变量,它把一个变量的值从主内存传送到线程中的事情内存,以便随后的load动作使用
  • load(载入):作用于事情内存的变量,它把read操作从主内存中获得的变量值放入事情内存的变量副本中
  • use(使用):作用于事情内存的变量,它把事情内存中一个变量的值通报给执行引擎
  • assign(赋值):作用于事情内存的变量,它把一个从执行引擎接收到的值赋值给事情内存中的变量
  • store(存储):作用于事情内存的变量,它把事情内存中的一个变量的值传送到主内存中,以便随后的write操作
  • write(写入):作用于主内存的变量,它把store操作从事情内存中获得的变量的值写入主内存的变量中

Java内存模子还划定了执行上述8种基本操作时必须知足如下规则

    1、不允许read和load、store和write操作之一单独泛起,以上两个操作必须按顺序执行,但没有保证必须延续执行,也就是说,read与load之间、store与write之间是可插入其他指令的。

    2、不允许一个线程抛弃它的最近的assign操作,即变量在事情内存中改变了之后必须把该转变同步回主内存。

    3、不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的事情内存同步回主内存中。

    4、一个新的变量只能从主内存中“降生”,不允许在事情内存中直接使用一个未被初始化(load或assign)的变量,换句话说就是对一个变量实行use和store操作之前,必须先执行过了assign和load操作。

    5、一个变量在同一个时刻只允许一条线程对其执行lock操作,但lock操作可以被同一个条线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。

    6、若是对一个变量执行lock操作,将会清空事情内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值。

    7、若是一个变量实现没有被lock操作锁定,则不允许对它执行unlock操作,也不允许去unlock一个被其他线程锁定的变量。

   8、对一个变量执行unlock操作之前,必须先把此变量同步回主内存(执行store和write操作)。

volatile关键字的作用

        保证了新值能立刻存储到主内存,每次使用前立刻从主内存中刷新。 
        克制指令重排序优化。 
        注:volatile关键字不能保证在多线程环境下对共享数据的操作的正确性。可以使用在自己状态改变之后需要立刻通知所有线程的情况下。 
   

final域

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)