- 浏览: 193207 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1126从 iBatis 到 MyBatis ... -
java 注解
2012-09-02 21:47 1050背景 最近在为公司 ... -
spring注解式事务管理实例@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
2012-07-17 21:58 2361spring注解式事务管理实例@Transactio ... -
MyEclipse内存不足以及参数配置“ -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M ”
2012-07-17 16:00 1030MyEclipse内存不足以 ... -
StringUtils 工具类的常用方法
2012-05-20 22:33 4542StringUtils 源码,使用的是commons-lang ... -
获得List<T> T的类型
2012-05-20 21:45 808public class GenericTest { ... -
可以使用java.util.Calendar来取得相关日期信息
2012-04-19 20:31 993import java.text.Parse ... -
提供一个JAVA过滤HTML代码和截取字符串的类(包括测试用例)
2012-03-07 22:23 1016package com.aodun.puhbs.blog ... -
ceshhisdf
2012-02-20 16:45 839ceshi -
JDKjdk1.4、jdk5.0、JDK6.0、 JDK7.0 新特性
2012-02-19 11:45 2976jdk1.4、jdk5.0、JDK6.0、 ... -
线程安全与线程不安全的区别
2012-02-19 11:15 664线程安全就是多线程访问时,采用了加锁机制(如synchr ... -
JConsole手册
2012-02-18 11:06 870http://blog.csdn.net/ajian005/a ... -
JVM调优总结(精)
2012-02-18 10:42 1949转自:http://pengjiaheng.javaey ... -
Java内存Dump文件查看和分析工具介绍
2012-02-16 23:43 1279为了查red5-0.7.0的内存泄露问题,由于dump文 ... -
探究JVM内存泄露
2012-02-16 23:32 1212WEB 服务总是莫名其妙的运行一段时间后 JVM 直接 ... -
设置JVM内存
2012-02-16 23:00 1134这里向大家简单介绍一下巧借MyEclipse设置JVM突 ... -
spring配置ibatis的jdbc方式和proxool、c3p0连接池方式
2011-06-30 10:19 1505spring配置ibatis的jdbc方式和proxool、c ... -
spring 事务管理配置-ibatis
2011-05-26 15:12 2338xml配置 Xml代码 1.<!-- 默认的数据 ... -
struts 格式化金额,日期
2011-04-11 17:50 13532010-07-21 Struts2中对数字进行格式化,1、将 ... -
log4j的日志处理
2011-03-12 12:34 888log4j的日志处理2009-06-11 ...
相关推荐
答:Java中有八种基本数据类型,分别为byte、short、int、long、float、double、char和boolean。 2. Java中如何实现多线程? 答:可以通过继承Thread类或实现Runnable接口来创建线程。另外,还可以使用Executor框架...
定义一个类名为"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)、字符型(char)和布尔型(boolean)。 3. **Java中的访问修饰符有哪些?** Java中的访问修饰符包括public、protected、...
一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...
Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble ...
2.1java中的8种基本数据类型:boolean byte char short int float double long 2.2:基本数据类型和它对应的封装类型之间可以相互转换,从基本数据类型到封装类 型叫做装箱,从封装类型到基本数据类型叫拆箱,...
为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域...
对象类型: 对象地址原子读写,线程安全 并发读不可变状态,线程安全 并发读写可变状态,非线程线程 基本类型: int,char数值读写,线程安全 long,double高低位,非线程安全 i++等组合操作,非线程安全
为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域...
答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...
1.1 为什么使用java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 java虚拟机 1.3.2 类装载器的体系结构 1.3.3 java class文件 1.3.4 java api 1.3.5 java程序设计语言 1.4 java体系结构的...
为什么? 答:有问题,因为3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是float number =(float)3.4;/ float number =3.4F;...
/ 342 13.1 概述 / 342 13.2 线程安全 / 343 13.2.1 Java语言中的线程安全 / 343 13.2.2 线程安全的实现方法 / 348 13.3 锁优化 / 356 13.3.1 自旋锁与自适应自旋 / 356 13.3.2 锁消除 / 357 13.3.3 锁粗化 ...
线程:Java中的线程是一种轻量级的执行单元,可以并发执行多个任务,提高程序的效率。 输入输出:Java中的输入输出主要包括标准输入输出流和文件操作等,可以读取用户输入和写入程序输出。 集合框架:Java中的集合...
4 软 件 最 终 产 品 :用 Java 语 言 开 发 的 软 件 可 以 具 有 可视化 、 可 听 化 、 可 操作 化 的 效 果 ,这 要 比 电 视 、 电 影 的 效果 更 为 理 想 ,因 为 它 可 以做 到 "即 时 、 交 互、 动 画 与 ...
volatile:volatile变量表示保证它必须是与主内存保持一致,它实际是""变量的同步"", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前,一般用于多线程编程。 abstract:抽象,必须重载,修饰...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
private long javacount; /** 可使用内存. */ private long totalMemory; /** 剩余内存. */ private long freeMemory; /** 最大可使用内存. */ private long maxMemory; /** 操作系统. */ private ...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。