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 #### 一、概述 `ConcurrentHashMap`是Java并发包(`java.util.concurrent`)中的一个重要组成部分,它提供了一个线程安全的哈希表实现。与传统的`Hashtable`相比,`...
java本地缓存ConcurrentHashMap
为了避免在扩容过程中锁住整个表,ConcurrentHashMap采用了特殊的扩容机制,确保即使在扩容过程中也能支持并发读写操作。 #### 四、应用场景 **1. 多线程环境下的数据共享** 当多个线程需要并发地访问和修改一个...
Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
与传统的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能,尤其是在读多写少的场景下。它通过引入锁分段技术解决了并发环境下效率低下的问题。 首先,我们来了解什么是线程安全的HashMap。HashMap在单...
在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
ConcurrentHashMap 广泛应用于 Java 开发中,例如,在大型的 Web 应用程序中,ConcurrentHashMap 可以用来存储用户的 Session 信息,在分布式系统中,ConcurrentHashMap 可以用来存储分布式锁等。
接着,我们来看`ConcurrentHashMap`,它是Java提供的线程安全的散列映射容器,适用于高并发环境。在Java 7中,`ConcurrentHashMap`采用了分段锁的设计,将整个哈希表分成若干个段(Segment),每个段有自己的锁,...
在理解`ConcurrentHashMap`的实现原理之前,我们先来看看哈希表的基本概念。 哈希表是一种键值对存储的数据结构,通过键(key)进行索引,可以高效地查找、插入和删除数据。如果键是整数,我们可以直接用它作为数组...
本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在...
ConcurrentHashMap在Java 8中放弃了分段锁,改用ForkJoinPool和CAS(Compare And Swap)操作,提高了并发性能。初始化时,它会创建一个固定大小的数组,并在put过程中: 1. 初始化数组,包括计算初始大小和填充因子...
为了避免这种情况,`ConcurrentHashMap`会在必要的时候重新哈希,以确保数据能够更均匀地分布在各个段中。 #### 五、示例代码分析 以下是一些关键的示例代码: ```java /** * The segments, each of which is a ...
【压缩包子文件的文件名称列表】中的"赚钱项目"看起来与`ConcurrentHashMap`的主题不直接相关,可能是压缩包内其他内容的误放,或者是一种隐喻,暗示掌握并发编程和高效数据结构对于开发高并发、高性能的软件项目的...
在Java面试中,经常会问到关于数据结构如HashTable和ConcurrentHashMap的细节,以及它们在并发编程中的使用。 最后,文档中出现了诸如“2399”、“1328”、“2645”、“2633”等数字,很可能是引用了一些代码片段或...
然而,在遍历ConcurrentHashMap时,需要注意一些关键点,否则可能会出现一些意外的结果。 方式一:使用for-each循环遍历entries 这种方式是最常用的遍历方式,使用for-each循环遍历ConcurrentHashMap的entries可以...