java内存模型详解

内存模型 (memory model)
内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节.

不同平台间的处理器架构将直接影响内存模型的结构.

在C或C++中, 可以利用不同操作平台下的内存模型来编写并发程序. 但是, 这带给开发人员的是, 更高的学习成本.
相比之下, java利用了自身虚拟机的优势, 使内存模型不束缚于具体的处理器架构, 真正实现了跨平台.
(针对hotspot jvm, jrockit等不同的jvm, 内存模型也会不相同)

内存模型的特征:
a, Visibility 可视性 (多核,多线程间数据的共享)
b, Ordering 有序性 (对内存进行的操作应该是有序的)

java 内存模型 ( java memory model )
根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。

每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
java内存模型
Read more…

2007/08/14 | Posted in Concurrency

volatile原理与技巧

volatile, 用更低的代价替代同步

为什么 使用volatile比同步代价更低?
同步的代价, 主要由其覆盖范围决定, 如果可以降低同步的覆盖范围, 则可以大幅提升程序性能.

而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.

volatile原理是什么?
volatile的语义, 其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见java内存模型)

因此, 当多核或多线程在访问该变量时, 都将直接 操作 主存, 这从本质上, 做到了变量共享.

volatile的有什么优势?
1, 更大的程序吞吐量
2, 更少的代码实现多线程
3, 程序的伸缩性较好
4, 比较好理解, 无需太高的学习成本

volatile有什么劣势?
1, 容易出问题
2, 比较难设计
Read more…

2007/08/05 | Posted in Concurrency

apache jakarta oro 常用例子(带注释)

package test;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.MatchResult;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import org.apache.oro.text.regex.Perl5Substitution;
import org.apache.oro.text.regex.Util;
 
/**
 * apache oro正则表达式学习
 *
 * @author xiaofeng
 *
 * @create 2007-5-21上午11:42:36
 */
public class RegexStudy {
    private static final Log log = LogFactory.getLog(RegexStudy.class);
    private PatternCompiler pc = new Perl5Compiler();
    private PatternMatcher matcher = new Perl5Matcher();
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        RegexStudy ps = new RegexStudy();
        ps.substitutePatternTest();
    }
 
    /**
     * 精确匹配表达式
     */
    public void simplePatternTest() {
        Pattern p = null;
 
        //编译一下,生成表达式
        try {
            p = pc.compile("<(([a-z]{2})|([0-9]{2}))>.*", Perl5Compiler.CASE_INSENSITIVE_MASK);
        } catch (MalformedPatternException e) {
            log.error("regex compile error : ", e);
        }
 
        if (null != p) {
            //查看字符串中是否完全匹配表达式p
            if (matcher.matches("<111>adsf", p)) {
                log.info("matched");
            } else {
                log.info("not matched");
            }
        }
    }
 
    /**
     * 部分匹配表达式
     */
    public void containsPatternTest() {
        Pattern p = null;
 
        //编译一下,生成表达式
        try {
            p = pc.compile("<(([a-z]{2})|([0-9]{2}))>.*", Perl5Compiler.CASE_INSENSITIVE_MASK);
        } catch (MalformedPatternException e) {
            log.error("regex compile error : ", e);
        }
 
        if (null != p) {
            //查看字符串中是否部分匹配表达式p
            if (matcher.contains("<11>adsf", p)) {
                log.info("matched");
                //得到匹配结果
                MatchResult mr = matcher.getMatch();
                //输出匹配的第一个子表达式值,从1开始的
                log.info(mr.group(1));
            } else {
                log.info("not matched");
            }
        }
    }
 
    /**
     * 根据匹配规则,替换子表达式
     */
    public void substitutePatternTest() {
        Pattern p = null;
 
        //编译一下,生成表达式
        try {
            p = pc.compile("<(([a-z]{2})|([0-9]{2}))>.*", Perl5Compiler.CASE_INSENSITIVE_MASK);
        } catch (MalformedPatternException e) {
            log.error("regex compile error : ", e);
        }
 
        if (null != p) {
            //得到匹配过后,替换掉子表达式值后的字符串
            String result = Util.substitute(
                    matcher,
                    p,
                    new Perl5Substitution("<$1>adsf"), //替换表达式
                    "<11>adsf", //匹配的字符串
                    Util.SUBSTITUTE_ALL //置换所有的
                );
            log.info(result);
        }
    }
 
}
2007/05/21 | Posted in Development Skills

jdk1.5常用新特性

1, 范型
使用范型, 可以做到方法参数,返回值,集合等都是类型安全的.
特别是,一个类使用了接口作为专递参数,可使用范型,将其参数进行泛化.
优点是: 简化变量名,支持多种实现.

2, 可变参数
方法中,同类型的多个参数,可以使用如下语法精简.
public void print(String a,String b,String c)
变成
public void print(String… strs)

3, for each的迭代,简化iterator接口
针对iterator接口的作用,简化了迭代的代码量.

List strs = new ArrayList();

for (String str : strs) {
//iterator here
}

4, 静态引入
将老的”类.方法”静态引用方式,替换成import进来.
import static com.java.Test;
此处Test是静态方法

5, 自动装箱/拆箱
针对Integer,Long,Double等包装类型,以后可以直接使用int,long,double
jdk编译时,会进行转换.

2006/10/10 | Posted in Development Skills