java的原子操作和volatile
原子操作
所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作 在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。 关于java中的原子性
原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。对于读取和写入出long和double之外的基本类型变量这样的操作 ,可以保证它们会被当作不可分(原子)的操作来操作。 volatile
当我们定义一个变量,假设就叫o吧,理论上讲,每次使用到o的时候,都应该从o的地址来读取这个变量,但是这存在一个效率问题,就是每次 使用o的时候都要从内存中去取值,然后通过系统总线传到CPU处理,这样开销会很大。所以编译器为了优化性能,把o放进CPU的Cache中,假如 o在赋值期间没有被改变,就直接从CPU的Cache里取o的副本来进行赋值。但是"bug"也显而易见,可能o已经被一个线程改变而重新写回了内存 ,但另一个线程并不知道,依旧按照原来的计划从CPU的Cache里读o的副本来取值,结果不幸发生了。 于是编译器的开发者为了补救这一"bug",提供了一个volatile让开发人员为他们的过失埋单,或者说提供给开发人员了一个选择效率的权利。 当变量加上了volatile时,编译器就老老实实的每次都从内存中读取这个变量值,否则就还按照优化的方案从cache里读。 在两个或者更多的线程访问的成员变量上使用volatile较好,当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
相关文档:
create PROCEDURE pagelist
@tablename nvarchar(50),
@fieldname nvarchar(50)='*',
@pagesize int output,--每页显示记录条数
@currentpage int output,--第几页
@orderid nvarchar(50),--主键排序
@sort int,--排序方式,1表示升序,0表示降序排列
......
第一部分. 提示
我需要读这篇文章吗?
Java类加载器对Java系统的运行是至关重要的,但是却常常被我们忽略。Java类加载器负载
在运行时查找和加载类。自定义类加载器可以完全改变类的加载方式,以自己喜欢的方式来
个性化你的Java虚拟机。本文简要的介绍Java类加载器,然后通过一个构造自定义类加载器
的例子来说明,这 ......
本文节选自《Java Web服务:构建与运行》2.1.1节
从WSDL文档中生成客户端支持代码(Generating Client-Support Code from a WSDL)
通过Java提供的“wsimport”工具可以很容易完成基于SOAP协议的Web服务客户端生成工作。这个工具可以从对应的WSDL文档的服务描述中生成客户端支持代码或其他相关资源。输入并执 ......
JVM:加载、链接和初始化
JVM要解释Java字节码,就必须对所需的类和接口执行如下3步操作:
(1) 加载:JVM在加载类时,会查找该类或该接口的二进制表示,并根据找到的二进制表示(通常是由Java编译器创建的类文件)创建一个Class对象。该Class对象中封装了类或接口的运行时状态。
(2) 链接:链接这一过程是指取得已加载的 ......
package algorithm.misc;
import util.*;
public class MaxProductOfN1 {
private static int exceptIndex = -1;
public static long regMethod(int data[])
{
long ret = Long.MIN_VALUE;
& ......