原子性

来源:互联网 发布:咨询公司数据分析 编辑:程序博客网 时间:2024/04/29 08:16

  当在一个表达式中使用一个non-long或者non-double型字段时,原子性可以确保你将获得这个字段的初始值或者某个线程对这个字段写入之后的值;但不会是两个或更多线程在同一时间对这个字段写入之后产生混乱的结果值(即原子性可以确保,获取到的结果值所对应的所有bit位,全部都是由单个线程写入的)。但是,如下面(译注:指可见性章节)将要看到的,原子性不能确保你获得的是任意线程写入之后的最新值。

  在Java 中除了 long 和 double 之外的所有基本类型的读和赋值,都是原子性操作。而64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性,会产生字撕裂问题。但是当你定义long或double变量时,如果使用 volatile关键字,就会获到(简单的赋值与返回操作的)原子性

  虽然java内存模型不保证non-volatile long 和 non-volatile double的原子性,当然它们在某些场合也具有原子性。(译注:non-volatile long在64位JVM,OS,CPU下具有原子性)
  注意,在JSR-133之前的旧内存模型中,一个64位long/double型变量的读/写操作可以被拆分为两个32位读/写操作来执行。从JSR-133内存模型(JDK5)开始,仅仅只允许把一个64位long/double型变量的写操作分拆成两个32位的写操作来执行,任意的读操作在JSR-133中都必须具有原子性。

0 0
原创粉丝点击