- 浏览: 197815 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (121)
- java_基础 (26)
- java_web (15)
- javascript (9)
- extJS (0)
- dwr (0)
- guobin_ETL (1)
- guobin_ssh (17)
- guobin_webservice (1)
- guobin_jbpm (0)
- guobin_jquery (0)
- guobin_acegi (1)
- guobin_poi/jxl (2)
- guobin_multiThread (0)
- guobin_名称解释 (0)
- guobin_FLEX (0)
- guobin_php (0)
- guobin_ORACLE (1)
- guobin_mysql (0)
- guobin_linux (0)
- guobin_powerDesigner (0)
- guobin_visol (0)
- guobin_ER/STUDIO (0)
- guobin_jmesa (0)
- guobin_weblogic (0)
- guobin_kettle (0)
- guobin_一路风雨 (5)
- guobin_spark (0)
- java_xml (7)
- guobin_规则引擎 (0)
- 插件开发 (2)
- 软件管理 (3)
- spring mvc (2)
- java_jni (1)
- eclipse (1)
- oracle (0)
- 项目学习笔记 (1)
- java多线程学习记录 (9)
- websphere性能设置和日常维护 (2)
- (1)
- 系统软件架构设计 (1)
- ces (1)
- 需求分析 (2)
- IBM-CICS GATEWAY (1)
- 工具使用 (1)
- 网络信息安全编程 (1)
最新评论
-
yzh__:
学习一个
Hibernate 自关联注解方式 -
xiaoyahuang:
"2)将Sysdeo Plugin下的DevLoad ...
eclipse项目引用 -
guobin6125:
guobin6125 写道sfasshahhah评论的评论
欢迎使用Kit! -
guobin6125:
sfass
欢迎使用Kit! -
guobin6125:
tst23
欢迎使用Kit!
Long与double操作并不是原子的
在java的部分执行 环境中,对于long以及double的操作并不是原子的。
例如有一个long类型的longfield字段,某个线程正在执行:
longfield = 123L ;
这样的指定操作,而同时有另一个线程正在执行:
longfield = 456L;
这样的指定操作。之后longfield的值会是什么,是无法保证的。也许是123L,也可能是456L,或许是0L,甚至还可能是31415926L。
所以我们可以的出下列结论:
1.基本类型,引用类型的指定,引用是原子的操作;
2.但是long与double的指定,引用是分割的;
3.要在线程间共享long与double字段是,必须在synchronized中操作,或是声明为volatile。
以前只知道Java中的long与double不是线程安全的,但不知道为什么,读《深入java虚拟机》一书,了解了大概。
Java虚拟机规范定义的许多规则中的一条:所有对基本类型的操作,除了某些对long类型和double类型的操作之外,都必须是原子级的。
由于规范没有规定如何实现,那么当今所知的虚拟机对这条规则的实现都是把32位值做为原子性对待,而不是64位做为原子性。那么,当线程把主存中的 long/double类型的值读到线程内存中时,可能是两次32位值的写操作,显而易见,如果几个线程同时操作,那么就可能会出现高低2个32位值出错 的情况发生,所以现在,java程序必须确保通过同步来操作共享的long和double。
参考: 1 《深入java虚拟机》
2 Long与double操作并不是原子的 http://blog.csdn.net/xingqisan/archive/2009/02/25/3935169.aspx
3 为什么Java中的long与double不是线程安全的? http://magnetocn.bokee.com/viewdiary.10946639.html
发表评论
-
从 iBatis 到 MyBatis - MyBatis 简明学习教程
2012-11-19 17:22 1175从 iBatis 到 MyBatis ... -
java 注解
2012-09-02 21:47 1104背景 最近在为公司 ... -
spring注解式事务管理实例@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
2012-07-17 21:58 2406spring注解式事务管理实例@Transactio ... -
MyEclipse内存不足以及参数配置“ -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M ”
2012-07-17 16:00 1057MyEclipse内存不足以 ... -
StringUtils 工具类的常用方法
2012-05-20 22:33 4577StringUtils 源码,使用的是commons-lang ... -
获得List<T> T的类型
2012-05-20 21:45 841public class GenericTest { ... -
可以使用java.util.Calendar来取得相关日期信息
2012-04-19 20:31 1027import java.text.Parse ... -
提供一个JAVA过滤HTML代码和截取字符串的类(包括测试用例)
2012-03-07 22:23 1054package com.aodun.puhbs.blog ... -
ceshhisdf
2012-02-20 16:45 869ceshi -
JDKjdk1.4、jdk5.0、JDK6.0、 JDK7.0 新特性
2012-02-19 11:45 3004jdk1.4、jdk5.0、JDK6.0、 ... -
线程安全与线程不安全的区别
2012-02-19 11:15 697线程安全就是多线程访问时,采用了加锁机制(如synchr ... -
JConsole手册
2012-02-18 11:06 902http://blog.csdn.net/ajian005/a ... -
JVM调优总结(精)
2012-02-18 10:42 1995转自:http://pengjiaheng.javaey ... -
Java内存Dump文件查看和分析工具介绍
2012-02-16 23:43 1315为了查red5-0.7.0的内存泄露问题,由于dump文 ... -
探究JVM内存泄露
2012-02-16 23:32 1244WEB 服务总是莫名其妙的运行一段时间后 JVM 直接 ... -
设置JVM内存
2012-02-16 23:00 1174这里向大家简单介绍一下巧借MyEclipse设置JVM突 ... -
spring配置ibatis的jdbc方式和proxool、c3p0连接池方式
2011-06-30 10:19 1540spring配置ibatis的jdbc方式和proxool、c ... -
spring 事务管理配置-ibatis
2011-05-26 15:12 2382xml配置 Xml代码 1.<!-- 默认的数据 ... -
struts 格式化金额,日期
2011-04-11 17:50 13872010-07-21 Struts2中对数字进行格式化,1、将 ... -
log4j的日志处理
2011-03-12 12:34 929log4j的日志处理2009-06-11 ...
相关推荐
在Java编程领域,多线程和线程安全是至关重要的概念,特别是在开发高效、响应迅速的应用程序时。本文将深入探讨如何在Java中实现多线程,并结合HTTP协议实现断点续传功能,以提高文件下载的效率和用户体验。 首先,...
总的来说,理解`long`和`double`在32位JVM中的非原子性是多线程编程中的一个重要知识点。在编写多线程代码时,应谨慎处理这类操作,尤其是当数据一致性至关重要的时候,可以借助synchronized关键字或原子类来确保...
- 基本数据类型如`char`、`int`的赋值和引用操作是原子的,但在Java语言规范中,`long`和`double`类型的赋值和引用操作并非总是原子的。 - 对象引用类型的赋值和引用操作也是原子的。 以上是对Java线程深入理解的...
6. 在Java中,什么是线程? 答:线程是程序执行的单元,可以独立执行,提高程序的执行效率。 Java网络编程 7. Java中,什么是Servlet? 答:Servlet是Java中的Web组件,用于处理HTTP请求。 8. 在Java中,什么是...
答:Java 中有八种基本数据类型:byte、short、int、long、float、double、char、boolean。 2. Java 中的访问修饰符有哪些? 答:Java 中的访问修饰符有四种:public、private、protected、default。 3. Java 中的...
答:Java 的基本数据类型包括 byte、short、int、long、float、double、char、boolean 等。 2. Java 中的引用类型有哪些? 答:Java 中的引用类型包括类、接口、数组、枚举、注解等。 3. Java 中的基本数据类型和...
在Java编程语言中,多线程是并发执行的程序组件,可以提高系统资源的利用率,提升应用程序的响应速度。本节我们将深入探讨Java中的多线程基础,特别是数组的定义方式及其元素的默认值规则。 首先,让我们了解什么是...
此外,文档讨论了如字分裂(Word Tearing)、double和long的非原子性处理等低级内存操作问题,以及线程间的公平性和wait集与通知机制。这些内容有助于深入理解Java内存模型和线程的高级特性和潜在陷阱。 文档结束...
Java线程与缓存是Java开发中至关重要的概念,尤其对于有一定经验的开发者来说,面试时往往会遇到相关问题。以下是对这些知识点的详细说明: 1. **基础信息** - **数据类型**:Java提供了八种原始数据类型,包括...
在Java编程中,多线程同步是一个核心概念,用于确保多个线程访问共享资源时的正确性。本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在“雪花飘 多线程java”这个项目中,我们的目标是利用多线程来实现一个视觉效果:在窗口中有多朵雪花随机地...
double 和 long 都是 64 位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。...
定义一个类名为"MyClass.java"的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明应为:CD A double a=1.0; A private class MyClass extends Object B class MyClass extends Object C ...
* Java 中的基本数据类型包括 byte、short、int、long、float、double、boolean、char 等。 * Java 中的异常处理机制包括 try-catch 语句和 throws 关键字。 * Java 中的集合框架包括 ArrayList、LinkedList、Vector...
Java 中各种数据的默认值有 Byte、short、int、long 等整形默认为 0,Boolean 默认为 false,Char 类型的默认值是 ’ ’,Float 和 double 类型的默认值是 0.0,对象类型的默认值是 null。 2. Java 中有哪些常用包...
Java 中的整型数据类型有 byte、short、int、long 四种,按需内存空间大小排序为 byte < short < int < long。 面向对象编程 4. Java 类可以作为?(C)答案:类型定义机制和数据封装机制 Java 类可以作为类型...
答:Java 中的基本数据类型包括 byte、short、int、long、float、double、boolean、char 等,它们是 Java 语言的基本组成部分。 Java 测试是 Java 开发者必备的基础知识测试,通过 Java 测试可以了解自己的 Java ...
14. **volatile变量**:volatile保证了变量在所有线程间可见性和简单的原子性,适用于long和double等非原子操作的变量。 15. **yield()与sleep()**:`yield()`让当前线程暂停,但不释放锁,可能更快地恢复执行。`...
instanceof是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例。 Java自动装箱与拆箱 装箱:自动将基本数据类型转换为包装器类型(int-->Integer),调用方法:Integer的valueOf(int)。 拆箱:自动将...