`
mooncui
  • 浏览: 72704 次
社区版块
存档分类
最新评论

在看ConcurrentHashMap的杂记

    博客分类:
  • Java
阅读更多
static final int MAXIMUM_CAPACITY = 1 << 30;   
//32位的int最大值+1的一半 
//(1073741824  0100 0000 0000 0000 0000 0000 0000 0000)
最大值MAX_VALUE = 0x7fffffff;
//(2147483647  0111 1111 1111 1111 1111 1111 1111 1111)

transient
意思是转瞬即逝的,它所修饰的变量将不被序列化,例如Thread就是这类的。另外static的变量和对象的方法也是不会被序列化的。

volatile
飞行的, 挥发性的, 可变的, 不稳定的, 轻快的, 爆炸性的
挥发物
class Gadget
{
public:
   void Wait()
   {
       while (!flag_)
       {
           Sleep(1000); // sleeps for 1000 milliseconds
       }
   }
   void Wakeup()
   {
       flag_ = true;
   }
   ...
private:
   bool flag_;
};

假设编译器发现Sleep(1000)是调用一个外部的库函数,它不会改变成员变量flag_,那么编译器就可以断定它可以把flag_缓存在寄存器中,以后可以访问该寄存器来代替访问较慢的主板上的内存。这对于单线程代码来说是一个很好的优化,但是在现在这种情况下,它破坏了程序的正确性:当你调用了某个Gadget的Wait函数后,即使另一个线程调用了Wakeup,Wait还是会一直循环下去。这是因为flag_的改变没有反映到缓存它的寄存器中去。编译器的优化未免有点太……乐观了。

在大多数情况下,把变量缓存在寄存器中是一个非常有价值的优化方法,如果不用的话很可惜。C和 C++给你提供了显式禁用这种缓存优化的机会。如果你声明变量是使用了volatile修饰符,编译器就不会把这个变量缓存在寄存器里——每次访问都将去存取变量在内存中的实际位置。这样你要对 Gadget的Wait/Wakeup做的修改就是给flag_加上正确的修饰:volatile.

关于volatile还有很多内容,见http://bbs.loveunix.net/viewthread.php?tid=8404。
分享到:
评论

相关推荐

    java源码剖析-ConcurrentHashMap

    ### Java源码剖析-ConcurrentHashMap #### 一、概述 `ConcurrentHashMap`是Java并发包(`java.util.concurrent`)中的一个重要组成部分,它提供了一个线程安全的哈希表实现。与传统的`Hashtable`相比,`...

    java本地缓存ConcurrentHashMap

    java本地缓存ConcurrentHashMap

    ConcurrentHashMap源码剖析

    为了避免在扩容过程中锁住整个表,ConcurrentHashMap采用了特殊的扩容机制,确保即使在扩容过程中也能支持并发读写操作。 #### 四、应用场景 **1. 多线程环境下的数据共享** 当多个线程需要并发地访问和修改一个...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    ConcurrentHashMap源码解析

    与传统的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能,尤其是在读多写少的场景下。它通过引入锁分段技术解决了并发环境下效率低下的问题。 首先,我们来了解什么是线程安全的HashMap。HashMap在单...

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug.docx

    在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...

    ConcurrentHashmap源码

    源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556

    ConcurrentHashMap的实现原理

    ConcurrentHashMap 广泛应用于 Java 开发中,例如,在大型的 Web 应用程序中,ConcurrentHashMap 可以用来存储用户的 Session 信息,在分布式系统中,ConcurrentHashMap 可以用来存储分布式锁等。

    java7-8中的 HashMap和ConcurrentHashMap全解析

    接着,我们来看`ConcurrentHashMap`,它是Java提供的线程安全的散列映射容器,适用于高并发环境。在Java 7中,`ConcurrentHashMap`采用了分段锁的设计,将整个哈希表分成若干个段(Segment),每个段有自己的锁,...

    ConcurrentHashMap的实现原理(JDK1.7和JDK1.8).pdf

    在理解`ConcurrentHashMap`的实现原理之前,我们先来看看哈希表的基本概念。 哈希表是一种键值对存储的数据结构,通过键(key)进行索引,可以高效地查找、插入和删除数据。如果键是整数,我们可以直接用它作为数组...

    ConcurrentHashMap思维导图完整版

    本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在...

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    ConcurrentHashMap在Java 8中放弃了分段锁,改用ForkJoinPool和CAS(Compare And Swap)操作,提高了并发性能。初始化时,它会创建一个固定大小的数组,并在put过程中: 1. 初始化数组,包括计算初始大小和填充因子...

    ConcurrentHashMap之实现细节

    为了避免这种情况,`ConcurrentHashMap`会在必要的时候重新哈希,以确保数据能够更均匀地分布在各个段中。 #### 五、示例代码分析 以下是一些关键的示例代码: ```java /** * The segments, each of which is a ...

    ConcurrentHashMap共18页.pdf.zip

    【压缩包子文件的文件名称列表】中的"赚钱项目"看起来与`ConcurrentHashMap`的主题不直接相关,可能是压缩包内其他内容的误放,或者是一种隐喻,暗示掌握并发编程和高效数据结构对于开发高并发、高性能的软件项目的...

    HashTable、ConcurrentHashMap.pdf

    在Java面试中,经常会问到关于数据结构如HashTable和ConcurrentHashMap的细节,以及它们在并发编程中的使用。 最后,文档中出现了诸如“2399”、“1328”、“2645”、“2633”等数字,很可能是引用了一些代码片段或...

    Java中遍历ConcurrentHashMap的四种方式详解

    然而,在遍历ConcurrentHashMap时,需要注意一些关键点,否则可能会出现一些意外的结果。 方式一:使用for-each循环遍历entries 这种方式是最常用的遍历方式,使用for-each循环遍历ConcurrentHashMap的entries可以...

Global site tag (gtag.js) - Google Analytics