本篇文章为大家展示了Java中怎么初始化ConcurrentHashMap,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、虚拟空间、营销软件、网站建设、新兴网站维护、网站推广。
首先看一下代码
private final Node[] initTable() { Node [] tab; int sc; while ((tab = table) == null || tab.length == 0) { // 第一次检查 if ((sc = sizeCtl) < 0) Thread.yield(); // lost initialization race; just spin else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) { try { if ((tab = table) == null || tab.length == 0) {// 第二次检查 int n = (sc > 0) ? sc : DEFAULT_CAPACITY; @SuppressWarnings("unchecked") Node [] nt = (Node [])new Node,?>[n]; table = tab = nt; sc = n - (n >>> 2); } } finally { sizeCtl = sc; } break; } } return tab; }
ConcurrentHashMap在初始化时,如何进行多线程间的同步?
ConcurrentHashMap
在初始化时,首先会判断,哈希表是否已经初始化了。如果没有,则尝试进行初始化。
首先会判断sizeCtl
的值。sizeCtl是用于多线程之间同步的一个互斥变量。当sizeCtl < 0时,表示已经有线程正在初始化哈希表或哈希表正在扩容,此时,不能再进行操作。
此处sizeCtl其实是实现了自旋锁的功能。自旋锁,即,获取锁失败时,让出CPU,稍后再进行尝试,重复这个过程,直到获得到锁为止。让出CPU的动作,是通过java中的Thread.yield()
来实现的。在学校学习java的时候曾经接触过线程的这个方法,但当时不明白什么场景下会用到。原来,Thread.yield()方法可以用来实现自旋锁。
上述内容就是Java中怎么初始化ConcurrentHashMap,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。