摘要: 这个问题的讨论来自内部的一个关于“多线程环境下使用Hashmap的安全问题”的讨论,HashMap多线程的问题之前已经提过一次,见之前的blog.本篇文章主要讨论多线程下race condition的问题。以下内容部分引用自内部邮件: 错误代码:定义成员变量private static Map cachedMap = new HashMap(7000);private static Boolean firstInvoke = true;程序是设想在第一次开始对该map变量进行初始化线程1:Public Object getMyValue(){ If(firstInvoke){ While(i. 阅读全文
posted @ 2011-03-29 17:45 redcreen 阅读(7445) 评论(0) 推荐(1) 编辑
摘要: vevocity在做渲染时会调用 org.apache.velocity.util.introspection.ClassMap$MethodCache.get方法 该方法完整代码(velocity1.6.1版本)如下 private final Map cache = new HashMap();public Method get(final String name, final Object [] params) throws MethodMap.AmbiguousException { String methodKey = makeMethodKey(name, params); Obj 阅读全文
posted @ 2011-03-29 14:58 redcreen 阅读(2316) 评论(0) 推荐(1) 编辑
摘要: 对于双检锁,其实有多种不同的用法,有很多种用法是无论如何不会出现问题的.我最初用双检锁来获取jndi对象时,立即有人告诉我双检锁是不安全的,我笑着告诉他:是否安全我比你更有把握.static DataSource ds = null;public static DataSource getDataSource(){ if(ds == null){ synchronized(this.getClass()){ if(ds == null) ds = xxx; } } return ds;} 这样的DCL有什么安全问题呢?它仅仅是为了不做重复的劳动.一是ds本身是已经存在的对象,不是动态构造的,. 阅读全文
posted @ 2011-03-29 14:41 redcreen 阅读(7147) 评论(0) 推荐(3) 编辑
摘要: 阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark word之类的名词。可以参考我的一篇博文:Java轻量级锁原理详解(Lightweight Locking) Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。 轻量级锁也是一种多线程优化,它与偏向锁的区别在于,轻量级锁是通过CAS来避免进入开销较大的互斥操作,而偏向锁是在无竞争场景下完全消除同步,连CAS也不执行(CAS本身仍旧是一种操作系统同步原语,始终要在JVM与OS之间来回,有一定的开销)。 所谓的. 阅读全文
posted @ 2011-03-29 14:41 redcreen 阅读(1621) 评论(0) 推荐(0) 编辑
摘要: 大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。 为了优化Java的Lock机制,从Java6开始引入了轻量级锁的概念。 轻量级锁(Lightweight Locking)本意是为了减少多线程进入互斥的几率,并不是要替代互斥。它利用了CPU原语Compare-And-Swap(CAS,汇编指令CMPXCHG),尝试在进入互. 阅读全文
posted @ 2011-03-29 14:40 redcreen 阅读(4706) 评论(0) 推荐(1) 编辑