文章参考:小刘讲源码

ConcurrentHashMap 源码解析_01 成员属性、内部类、构造方法解析

1、简介

  • ConcurrentHashMap 是 HashMap 的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。相比于同样线程安全的 HashTable 来说,效率等等各方面都有极大的提升。
  • 在学习 ConcurrentHashMap 源码之前,这里默认大家已经读过 HashMap 源码,了解 LongAdder 原子类、红黑树。参考:红黑树学习笔记(自己实现一个简单的红黑树)、HashMap 底层源码细致分析、JDK 集合LinkedHashMap源码解析、JDK 8 新特性 LongAdder 源码解析

先简单介绍一下 ConcurrentHashMap 的整体流程:

整体流程跟 HashMap 比较类似,大致是以下几步:

  1. 如果桶数组未初始化,则初始化;
  2. 如果待插入的元素所在的桶为空,则尝试把此元素直接插入都桶中的第一个位置;
  3. 如果正在扩容,则当前线程一起加入到扩容的过程中;
  4. 如果待插入的元素所在的桶不为空且不存在迁移的元素,则锁住这个桶(分段锁)
  5. 如果当前桶中元素以链表方式存储,则在链表中寻找该元素或者插入元素;
  6. 如果当前桶中元素以红黑树方式存储,则在红黑树中寻找该元素或者插入元素;
  7. 如果元素存在,则返回旧值
  8. 如果元素不存在,整个 Map 的元素加 1,并检查是否需要扩容;

添加元素操作中使用的锁主要有(自旋锁 + CAS + synchronized + 分段锁)。

为什么使用 synchronized 而不是 ReentrantLock?

因为 synchronized 已经得到了极大的优化,在特定情况下并不比 ReentrantLock 差。

2、JDK1.8 ConcurrentHashMap 结构图

7JmSCq.png

3、成员属性

/*** 散列表数组最大限制*/
private static final int MAXIMUM_CAPACITY = 1 << 30;/*** 散列表默认值*/
private static final int DEFAULT_CAPACITY = 16;/*** 支持的数组最大长度,不少MAX_INTEGER_VALUE*/
static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;/*** 并发级别:JDK1.7遗留下来的,JDK1.8只有在初始化的时候用了一用,并不代表并发级别*/
private static final int DEFAULT_CONCURRENCY_LEVEL = 16;/*** 负载因子,JDK1.8中,ConcurrentHashMap是固定值*/
private static final float LOAD_FACTOR = 0.75f;/*** 树化阙值,指定桶位  链表长度达到8的话,有可能发生树化操作*/
static final int TREEIFY_THRESHOLD = 8;/*** 红黑树转化为链表的阙值*/
static final int UNTREEIFY_THRESHOLD = 6;/*** 联合TREEIFY_THRESHOLD控制桶位是否树化条件,只有当table数组长度达到64且某个桶位中的链表长度达到8才会真正树化*/
static final int MIN_TREEIFY_CAPACITY = 64;/*** 线程迁移数据最小步长,控制线程迁移任务最小区间的一个值*/
private static final int MIN_TRANSFER_STRIDE = 16;/*** 扩容相关,计算扩容时生成的一个标识戳*/
private static int RESIZE_STAMP_BITS = 16;/*** 65535,表示并发扩容最多线程数*/
private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1;/*** 扩容相关*/
private static final int RESIZE_STAMP_SHIFT = 32 - RESIZE_STAMP_BITS;/** Encodings for Node hash fields. See above for explanation.*/
// 当node节点的hash值为-1的时候,表示当前节点是FWD节点
static final int MOVED     = -1; // hash for forwarding nodes
// 当node节点的hash值是-2的时候,表示当前节点已经树化了且当前节点为TreeBin对象,TreeBin对象代理操作红黑树
static final int TREEBIN   = -2; // hash for roots of trees
static final int RESERVED  = -3; // hash for transient reservations
// 0x7fffffff => 0111 1111 1111 1111 1111 1111 1111 1111 可以将一个负数通过位与运算后得到正数,但是不少取绝对值
static final int HASH_BITS = 0x7fffffff; // usable bits of normal node hash// 当前系统的CPU数量
static final int NCPU = Runtime.getRuntime().availableProcessors();// 散列表对象,长度一定是2的次方数
transient volatile Node<K,V>[] table;// 扩容过程中会将扩容中的新table赋值给nextTable,保持引用,扩容结束之后,这里会被设置为null
private transient volatile Node<K,V>[] nextTable;// LongAdder中的baseCount,未发生竞争的时候或者当前LongAdder处于加锁状态中,增量累加到baseCount中
private transient volatile long baseCount;/*** sizeCtl < 0* 1.-1的时候表示当前的table正在初始化(有线程正在创建table数组)当前线程需要自旋等待* 2.表示当前map正在进行扩容,高16位表示:扩容的标识戳 低16位表示:(1 + nThread)表示当前参与并发扩容的线程数量** sizeCtl == 0 表示创建table数组的时候,使用DEFAULT_CAPACITY 为大小** sizeCtl > 0* 1. 如果table未初始化,表示初始化大小* 2. 如果table已经初始化,表示下次扩容时的触发条件(阙值)*/
private transient volatile int sizeCtl;// 扩容过程中,记录当前进度,所有线程都需要从transferIndex中分配区间任务,去执行自己的任务
private transient volatile int transferIndex;// LongAdder 中的cellsBusy 0表示当前LongAdder对象无锁状态,1表示处于加锁状态
private transient volatile int cellsBusy;// LongAdder 中的cells数组,当baseCount发生竞争后,会创建cells数组
// 多线程情况下,线程会通过计算hash值取到自己的cell位置,将增量累加到cell中
// 总个数 = sum(cells) + baseCount
private transient volatile CounterCell[] counterCells;

4、静态属性

// Unsafe mechanics
private static final sun.misc.Unsafe U;
// 表示sizeCtl属性在ConcurrentHashMap中的内存偏移地址
private static final long SIZECTL;
// 表示transferIndex属性在ConcurrentHashMap中的内存偏移地址
private static final long TRANSFERINDEX;
// 表示baseCount属性在ConcurrentHashMap中的内存偏移地址
private static final long BASECOUNT;
// 表示cellsbusy属性在ConcurrentHashMap中的内存偏移地址
private static final long CELLSBUSY;
// 表示cellsvalue属性在CounterCell中的内存偏移地址
private static final long CELLVALUE;
// 表示数组第一个元素的偏移地址
private static final long ABASE;
// 该属性用于数组寻址,轻继续往下阅读即可了解
private static final int ASHIFT;

5、静态代码块

static {try {U = sun.misc.Unsafe.getUnsafe();Class<?> k = ConcurrentHashMap.class;SIZECTL = U.objectFieldOffset(k.getDeclaredField("sizeCtl"));TRANSFERINDEX = U.objectFieldOffset(k.getDeclaredField("transferIndex"));BASECOUNT = U.objectFieldOffset(k.getDeclaredField("baseCount"));CELLSBUSY = U.objectFieldOffset(k.getDeclaredField("cellsBusy"));Class<?> ck = CounterCell.class;CELLVALUE = U.objectFieldOffset(ck.getDeclaredField("value"));Class<?> ak = Node[].class;// 拿到数组第一个元素的偏移地址ABASE = U.arrayBaseOffset(ak);// 表示数组中每一个单元所占用的空间大小,即scale表示Node[]数组中每一个单元所占用的空间int scale = U.arrayIndexScale(ak);// (scale & (scale - 1)) != 0:判断scale的数值是否是2的次幂数// java语言规范中,要求数组中计算出的scale必须为2的次幂数// 1 0000 % 0 1111 = 0if ((scale & (scale - 1)) != 0)throw new Error("data type scale not a power of two");// numberOfLeadingZeros(scale) 根据scale,返回当前数值转换为二进制后,从高位到地位开始统计,统计有多少个0连续在一块:eg, 8转换二进制=>1000 则 numberOfLeadingZeros(8)的结果就是28,为什么呢?因为Integer是32位,1000占4位,那么前面就有32-4个0,即连续最长的0的个数为28个// 4转换二进制=>100 则 numberOfLeadingZeros(8)的结果就是29// ASHIFT = 31 - Integer.numberOfLeadingZeros(4) = 2 那么ASHIFT的作用是什么呢?其实它有数组寻址的一个作用:// 拿到下标为5的Node[]数组元素的偏移地址(存储地址):假设此时 根据scale计算得到的ASHIFT = 2// ABASE + (5 << ASHIFT) == ABASE + (5 << 2) == ABASE + 5 * scale,就得到了下标为5的数组元素的偏移地址ASHIFT = 31 - Integer.numberOfLeadingZeros(scale);} catch (Exception e) {throw new Error(e);}
}

6、内部类

6.1、Node 节点

static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;// 保存内存可见性volatile V val;volatile Node<K,V> next;Node(int hash, K key, V val, Node<K,V> next) {this.hash = hash;this.key = key;this.val = val;this.next = next;}public final K getKey()       { return key; }public final V getValue()     { return val; }public final int hashCode()   { return key.hashCode() ^ val.hashCode(); }public final String toString(){ return key + "=" + val; }public final V setValue(V value) {throw new UnsupportedOperationException();}// 这里equals是以Entry节点来进行比较访问的public final boolean equals(Object o) {Object k, v, u; Map.Entry<?,?> e;return ((o instanceof Map.Entry) &&(k = (e = (Map.Entry<?,?>)o).getKey()) != null &&(v = e.getValue()) != null &&(k == key || k.equals(key)) &&(v == (u = val) || v.equals(u)));}/*** Virtualized support for map.get(); overridden in subclasses.*/Node<K,V> find(int h, Object k) {Node<K,V> e = this;if (k != null) {do {K ek;if (e.hash == h &&((ek = e.key) == k || (ek != null && k.equals(ek))))return e;} while ((e = e.next) != null);}return null;}
}

6.2、ForwardingNode 节点

这个内部类在之后分析扩容的时候会再仔细进行探究,这里先熟悉一下:

// 如果是一个写的线程(eg:并发扩容线程),则需要为创建新表贡献一份力
// 如果是一个读的线程,则调用该内部类的find(int h, Object k)方法
static final class ForwardingNode<K,V> extends Node<K,V> {// nextTable表示新散列表的引用final Node<K,V>[] nextTable;ForwardingNode(Node<K,V>[] tab) {super(MOVED, null, null, null);this.nextTable = tab;}// 到新表上去读数据Node<K,V> find(int h, Object k) {// loop to avoid arbitrarily deep recursion on forwarding nodesouter: for (Node<K,V>[] tab = nextTable;;) {Node<K,V> e; int n;if (k == null || tab == null || (n = tab.length) == 0 ||(e = tabAt(tab, (n - 1) & h)) == null)return null;for (;;) {int eh; K ek;if ((eh = e.hash) == h &&((ek = e.key) == k || (ek != null && k.equals(ek))))return e;if (eh < 0) {if (e instanceof ForwardingNode) {tab = ((ForwardingNode<K,V>)e).nextTable;continue outer;}elsereturn e.find(h, k);}if ((e = e.next) == null)return null;}}}
}

6.3、TreeNode 节点

TreeBin 中会用到该节点,之后会进行细说:

static final class TreeNode<K,V> extends Node<K,V> {// 父节点TreeNode<K,V> parent;  // red-black tree links// 左子节点TreeNode<K,V> left;// 右节点TreeNode<K,V> right;// 前驱节点TreeNode<K,V> prev;    // needed to unlink next upon deletion// 节点有红、黑两种颜色~boolean red;TreeNode(int hash, K key, V val, Node<K,V> next,TreeNode<K,V> parent) {super(hash, key, val, next);this.parent = parent;}Node<K,V> find(int h, Object k) {return findTreeNode(h, k, null);}/*** Returns the TreeNode (or null if not found) for the given key* starting at given root.*/final TreeNode<K,V> findTreeNode(int h, Object k, Class<?> kc) {if (k != null) {TreeNode<K,V> p = this;do  {int ph, dir; K pk; TreeNode<K,V> q;TreeNode<K,V> pl = p.left, pr = p.right;if ((ph = p.hash) > h)p = pl;else if (ph < h)p = pr;else if ((pk = p.key) == k || (pk != null && k.equals(pk)))return p;else if (pl == null)p = pr;else if (pr == null)p = pl;else if ((kc != null ||(kc = comparableClassFor(k)) != null) &&(dir = compareComparables(kc, k, pk)) != 0)p = (dir < 0) ? pl : pr;else if ((q = pr.findTreeNode(h, k, kc)) != null)return q;elsep = pl;} while (p != null);}return null;}
}

7、构造方法

public ConcurrentHashMap() {
}public ConcurrentHashMap(int initialCapacity) {if (initialCapacity < 0)throw new IllegalArgumentException();int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?MAXIMUM_CAPACITY :tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));this.sizeCtl = cap;
}public ConcurrentHashMap(Map<? extends K, ? extends V> m) {this.sizeCtl = DEFAULT_CAPACITY;putAll(m);
}public ConcurrentHashMap(int initialCapacity, float loadFactor) {this(initialCapacity, loadFactor, 1);
}public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel) {if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)throw new IllegalArgumentException();if (initialCapacity < concurrencyLevel)   // Use at least as many binsinitialCapacity = concurrencyLevel;   // as estimated threadslong size = (long)(1.0 + (long)initialCapacity / loadFactor);int cap = (size >= (long)MAXIMUM_CAPACITY) ?MAXIMUM_CAPACITY : tableSizeFor((int)size);this.sizeCtl = cap;
}

构造方法与 HashMap 对比可以发现,没有了 HashMap 中的 thresoldloadFactor,而是改用了 sizaCtl 来控制,而且只存储了容量里面,那么它是怎么用的呢?官方给出的解释如下:

  • -1,表示有线程正在进行初始化操作。
  • -(1 + nThreads),表示有 n 个线程正在一起扩容。
  • 0,默认值,后续再真正初始化的时候使用默认容量。
  • > 0,初始化或者扩容完成后下一次的扩容门槛。

8、内部小方法分析

下面在正式分析并发 HashMap 成员方法之前,先分析一些内部类中的子方法函数:

首先看一下 ConcurrentHashMap 内部类 Node 中的 hash 成员属性值的计算方法 spread(int h)

static class Node<K,V> implements Map.Entry<K,V> {final int hash;// 该属性是通过spread(int h)方法计算得到~ h 代表keyfinal K key;volatile V val;volatile Node<K,V> next;Node(int hash, K key, V val, Node<K,V> next) {this.hash = hash;this.key = key;this.val = val;this.next = next;}...
}

8.1、spread(int h) 方法

// 扰动函数
/*** 计算Node 节点hash 值的算法:参数为h的hash值* eg:* h二进制为:-->                  1100 0011 1010 0101 0001 1100 0001 1110* (h >>> 16) -->                0000 0000 0000 0000 1100 0011 1010 0101* (h ^ (h >>> 16)) -->          1100 0011 1010 0101 1101 1111 1011 1011* 注意:(h ^ (h >>> 16)) 目的是让h的高16位也参与进来寻址,使得到的哈希值更加的分散,减少哈希冲突的次数* --------------------------------------------------------------------------------------* HASH_BITS -->                 0111 1111 1111 1111 1111 1111 1111 1111* (h ^ (h >>> 16)) -->          1100 0011 1010 0101 1101 1111 1011 1011* (h ^ (h >>> 16)) & HASH_BITS  0100 0011 1010 0101 1101 1111 1011 1011* 注意,(h ^ (h >>> 16)) 得到的结果在 & HASH_BITS,目的是为了让得到的hash值结果始终是一个正数*/
static final int spread(int h) {// 让原来的hash值异或^原来hash值的右移16位,再&上HASH_BITS(0x7fffffff:二进制位31个1)return (h ^ (h >>> 16)) & HASH_BITS;
}

下面介绍 tabAt(Node<K,V>[] tab, int i)方法:获取 tab[Node[]] 数组指定下标 i 的 Node 节点。

8.2、tabAt(Node<K,V>[] tab, int i) 方法

/*** 获取 tab(Node[]) 数组中指定下标位置 i 的Node元素* Node<K,V> tab:表示Node[]数组* int i:表示数组下标*/
@SuppressWarnings("unchecked")
static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) {// ((long)i << ASHIFT) + ABASE的作用:请看下面的分析return (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE);
}

再分析 ((long)i << ASHIFT) + ABASE 的时候,先复习一下上面所说的介绍的一些静态属性字段的含义:

// Node 数组的Class 对象
Class<?> ak = Node[].class;
// U.arrayBaseOffset(ak):根据ak 获取NOde[] 数组第一个元素的偏移地址
ABASE = U.arrayBaseOffset(ak);
// 表示数组单元所占用空间大小,scale表示Node[]数组中每一个单元所占用的空间大小
int scale = U.arrayIndexScale(ak);
// 在java语言中scale必须是二的次方数,这里就是一个小算法判断scale是不是二的次方数
// 如果不是则报错
if ((scale & (scale - 1)) != 0)throw new Error("data type scale not a power of two");
// numberOfLeadingZeros(scale):根据scale,返回的当前数值转化位二进制后,这里注意(scale的值一定是2的次幂数),从那个高位到低位开始统计,统计有多少个0连续在一块
// eg:8 -> 1000 则numberOfLeadingZeros(8) 的值就是28,为什么呢?因为Integer是32位,1000占4位,那么前面就有32-4个0,即连续最长的0的个数为28个
// 4-> 100,则numberOfLeadingZeros(4)的值就是29
// ASHIFT = 31 - Integer.numberOfLeadingZeros(4) = 2,那么ASHIFT的作用是什么呢?其实它有一个数组寻址的一个作用:
// 拿到下标为5的Node[] 数组元素的偏移地址(存储地址):假设此时根据scale计算得到的ASHIFT = 2
// ASHIFT主要是用于内存寻址的时使用,假如我们要寻找第6桶位的地址,ABSE + 5 * scale
// 转化为 ABASE + (5 << ASHIFT)
ASHIFT = 31 - Integer.numberOfLeadingZeros(scale);

由上面的几个属性字段的复习介绍,不难得出:

  • ((long)i << ASHIFT) + BASE 就是得到当前 Node[] 数组下标为 i 的节点对象的偏移地址。
  • 然后再通过 (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE) 方法,根据 Node[]目标节点 Node 的偏移地址 两个参数,得到下标为 i 的 Node 节点对象。
  • 虽然这样很绕,不如直接使用乘法看起来简便,但是直接根据偏移地址去寻找数组元素效率较高。

8.3、casTabAt(Node<K,V>[] tab, int i) 方法

/*** 通过 CAS 的方式去向Node 数组指定位置i设置节点值,设置成功返回true,否则返回false* Node<K,V>[] tab:表示Node[] 数组* int i:表示数组下标* Node<K,V> c:期望节点值* Node<K,V> v:要设置的节点值*/
static final <K,V> boolean casTabAt(Node<K,V>[] tab, int i,Node<K,V> c, Node<K,V> v) {// 调用Unsafe的比较并交换去设置Node[]数组指定位置的节点值,参数如下:// tab:Node[] 数组// ((long)i << ASHIFT) + ABASE:下标为i的数组桶的偏移地址// c:期望节点值// v:要设置的节点的新值return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v);
}

8.4、setTabAt(Node<K,V>[] tab, int i, Node<K,V> v)方法

/*** 根据数组下标,设置 Node[] 数组指定下标位置的节点值:* Node<K,V>[] tab:表示 Node[] 数组* int i:表示数组下标* Node<K,V> v:要设置的节点值*/
static final <K,V> void setTabAt(Node<K,V>[] tab, int i, Node<K,V> v) {// ((long)i << ASHIFT) + ABASE:下标为i数组桶的偏移地址U.putObjectVolatile(tab, ((long)i << ASHIFT) + ABASE, v);
}

8.5、resizeStamp(int n) 方法

// table数组扩容给的时候,计算出一个扩容标识戳,当需要并发扩容的时候,当前线程必须拿到扩容标识戳才能参与到扩容中去
static final int resizeStamp(int n) {// RESIZE_STAMP_BITS:固定值 16,与扩容相关,计算扩容的时候会根据该属性值生成一个扩容标识戳return Integer.numberOfLeadingZeros(n) | (1 << (RESIZE_STAMP_BITS - 1));
}

举例子分析一下:

  • 当我们需要 table 容量从 16 扩容到 32的时候,Integer.numberOfLeadingZeros(16) 会得到 27,怎么得来的呢?
    • numberOfLeadingZeros(n) 根据传入的 n,返回当前数值转换为二进制后,从高位到低位开始统计,统计有多少个0连续再一块:
      • eg:16 转换二进制 => 1 0000numberOfLeadingZeros(16) 的结果就是 27,因为 Integer 是32位,1 0000 占5位,那么前面就有 32 - 5 个 0,即连续最长的 0 个数为 27 个。
  • 1 << (RESIZE_STAMP_BITS - 1) :其中 RESIZE_STAMP_BITS 是一个固定值 16,与扩容相关,计算扩容的时候会根据该属性值生成一个扩容标识戳。、
  • 下面就来计算一下:
// 从 16 扩容到 32
16 -> 32
numberOfLeadingZeros(16) => 1 0000 => 27 => 0000 0000 0001 1011
// 用 B 表示:
(1 << (RESIZE_STAMP_BITS - 1)) => (1 << (16 - 1)) => 1000 0000 0000 0000 => 32768// A | B
Integer.numberOfLeadingZeros(n) | (1 << (RESIZE_STAMP_BITS - 1)) 
-----------------------------------------------------------------
0000 0000 0001 1011   ---> A
1000 0000 0000 0000   ---> B
-------------------  ---> | 按位或 
1000 0000 0001 1011  ---> 计算得到扩容标识戳

8.6、tableSizeFor(int c) 方法

/*** 返回大于等于 c 的最小的2的次方数* eg: c = 28* n = c - 1 = 27 -> 0b11011* n |= n >>> 1* n => 11011 |= 01101 => 11111* n |= n >>> 2* n => 11111 |= 00111 => 11111* ...* => 1111 + 1 = 32*/
private static final int tableSizeFor(int c) {int n = c - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

8.7、构造方法

// 无参构造方法
public ConcurrentHashMap() {
}// 指定初始化容量
public ConcurrentHashMap(int initialCapacity) {// 判断给定的数组初始长度是否小于0,小于0的话直接抛出异常if (initialCapacity < 0)throw new IllegalArgumentException();int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?MAXIMUM_CAPACITY :tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));// sizeCtl>0// 当size初始化的时候,sizeCtl表示初始化容量this.sizeCtl = cap;
}// 根据一个 Map 集合来初始化
public ConcurrentHashMap(Map<? extends K, ? extends V> m) {// sizeCtl 设置为默认容量值this.sizeCtl = DEFAULT_CAPACITY;putAll(m);
}// 指定初始化容量和负载因子
public ConcurrentHashMap(int initialCapacity, float loadFactor) {this(initialCapacity, loadFactor, 1);
}// 指定初始化容量,和负载因子,并发级别
public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel) {if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)throw new IllegalArgumentException();// 当指定的初始化容量initialCapacity 小于并发级别 concurrencyLevel的时候if (initialCapacity < concurrencyLevel)   // Use at least as many bins// 初始化容量的值设置为并发级别的值// 即,JDK1.8之后并发级别由散列表长度决定initialCapacity = concurrencyLevel;   // as estimated threads// 根据初始化容量和负载因子,去计算sizelong size = (long)(1.0 + (long)initialCapacity / loadFactor);// 根据size重新计算数组初始化容量int cap = (size >= (long)MAXIMUM_CAPACITY) ?MAXIMUM_CAPACITY : tableSizeFor((int)size);/*** sizeCtl > 0* 当目前table未初始化的时候, sizeCtl 表示初始化容量*/this.sizeCtl = cap;
}

至此,ConcurrentHashMap 的源码分析准备工作就完成了,之后会更新其中一些较为麻烦的方法。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Transucence Research Inc得发起者Charles Lu ,漂亮国职场得黑暗时刻

    我们印象中&#xff0c;漂亮国得1些因特网公司机构职员&#xff0c;都is精英中得精英。她们得出现都is西装革履&#xff0c;被聚光灯所包围&#xff0c;现实果真如此吗&#xff1f;事实上&#xff0c;这边些传统意义上得精英&#xff0c;背地里干得勾当往往更能惊掉我们得眼球。…...

    2024/4/14 16:14:56
  2. fabric

    安装环境 vmware Ubuntu 18.04.5 注意 都以root用户执行 $ sudo -i然后输入密码 1 准备依赖环境 1.0 ubuntu软件更换国内源 参考 1.1 安装git $ apt install git1.2 安装 cURL $ apt install curl1.3 安装 Docker 查看系统是否已经安装 Docker&#xff1a; $ docke…...

    2024/4/20 0:08:10
  3. thymeleaf

    模板&#xff1a;准备呈现给用户的视图页面 数据&#xff1a;提供数据有多种方式 request.setAttribute(); model.addtribute();模板引擎&#xff1a;处理模板和数据的程序。获取模板&#xff0c;吧模板中的特定符号&#xff0c;替换为数据&#xff0c;生成输出结果文件 jsp…...

    2024/5/8 16:25:37
  4. 【渝粤教育】国家开放大学2018年秋季 2130T药物治疗学 参考试题

    试卷代号&#xff1a;2180 办公室管理 试题 2019年1月 一、单项选择题&#xff08;请将正确答案的字母序号填在括号内&#xff0c;每小题2分&#xff0c;共10分&#xff09; 1&#xff0e;办公室工作的本质属性是( ) A&#xff0e;事务性 B&#xff0e;综合性 C&#xff0e;服…...

    2024/5/8 16:13:22
  5. OSPF总结

    第一部分 一、五种数据包 OSPF的数据包有5种 hello包——组播收发&#xff0c;用于邻居、邻接关系的发现、建立、周期保活 DBD——数据库描述包 — 本地LSDB&#xff08;链路状态数据库&#xff09;目录 LSR——链路状态请求 — 用于询问对端本地未知的LSA信息 LSU——链路状态…...

    2024/4/19 10:37:35
  6. 如何学好Java?

    “如何学好Java&#xff1f;”是Java入门小白和有基础的Java学习者共同关注的话题&#xff0c;今天我们一起聊聊“如何学好Java&#xff1f;” 理解Java思想 首先Java与中文和英文一样&#xff0c;是一门语言&#xff0c;是一门计算机编程语言&#xff0c;在计算机世界应用。然…...

    2024/4/24 22:10:09
  7. CentOS7安装jenkins

    1.安装jdk yum install -y java2.安装jenkins 把jenkins的网址导入yum安装里&#xff0c;然后用yum安装但是要注意跳过签名认证 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import https://jenkins-ci.org/redhat/jenkins…...

    2024/5/6 4:53:00
  8. selenium添加Tampermonkey插件并添加脚本

    目录加载插件插件的crx文件下载添加脚本加载插件 chrome浏览器下载Tampermonkey的crx插件到本地&#xff0c;启动webdriver时自动配备插件 插件的crx文件下载 下载插件CRX Extractor 扩展商城搜索Tampermonkey BETA&#xff0c;右键下载crx文件 在options中添加插件 option…...

    2024/5/6 14:46:34
  9. (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第一节:SQL概述

    文章目录一&#xff1a;SQL的产生与发展二&#xff1a;SQL特点&#xff08;1&#xff09;综合统一&#xff08;2&#xff09;高度非过程化&#xff08;3&#xff09;面向集合的操作方式&#xff08;4&#xff09;以同一种语法结构提供多种使用方式&#xff08;5&#xff09; 语…...

    2024/4/14 16:15:47
  10. python web02-06-循环为多个客户端服务器

    python web02-06-循环为多个客户端服务器 功能: 可以服务多个客户端服务 缺陷: 1、客户端可以连接本服务器,但是只能是一个一个排队的方式来处理,即理解为服务器只有一个服务人员来处理,其他的如果也要服务器服务的话,那么需要等待上一个客户服务完成以后,才能对下一…...

    2024/4/19 16:26:17
  11. 群发邮件软件是什么?如何高效把邮件群发出去?

    最近在工作中&#xff0c;总是感觉心有余力不足的感觉。于是我把我的疑问和困扰&#xff0c;跟闺蜜讲了起来&#xff0c;我说最近没有签下来一家客户&#xff0c;群发邮件也发不出去&#xff0c;搞的自己都快emo了。 这时闺蜜问我你使用的是什么邮箱啊&#xff1f;我说就是普通…...

    2024/5/6 12:45:29
  12. 大小端存储模式介绍以及设计程序判断当前机器的存储模式

    对于a来讲 其二进制原码反码补码相同 00000000 00000000 00000000 00010100 转化为十六进制 00 00 00 14 而在计算机内存中却以 14 00 00 00 的形式存在 此时就涉及到大小端存储模式 大小端介绍 大端存储模式&#xff1a;是指数据的低位保存在内存的高地址中&#xf…...

    2024/4/20 9:23:45
  13. 企业微信组织架构同步教程

    大部分企业正在面临着员工成本高&#xff0c;办公效率低等问题。特别是大型企业&#xff0c;组织架构复杂&#xff0c;业务流程繁琐&#xff0c;内部同时有OA系统、BI系统、ERP系统......且各个系统都需要独立登陆&#xff0c;造成IT部门数据监管困难&#xff01;如何在同一套中…...

    2024/4/14 16:15:37
  14. 中国十大童鞋排行榜

    近些年&#xff0c;随着童鞋品牌的增多&#xff0c;相信很多宝妈都会存在选择上的困难。童鞋品牌多种多样&#xff0c;应该如何选择适合自己宝宝的呢&#xff1f; 今天&#xff0c;我们根据近段时间的童鞋大数据&#xff0c;结合童鞋品牌评价以及销量罗列出2021年童鞋十大品牌排…...

    2024/5/6 5:05:22
  15. 计算机毕业设计android的消防安全知识宣传app(源码+系统+mysql数据库+Lw文档)

    项目介绍 近年来&#xff0c;随着消防重要性的逐渐增加&#xff0c;人工书写数据已经不能够处理如此庞大的数据。为了更好的适应信息时代的高效性&#xff0c;一个利用计算机来实现消防网站工作的网站将必然诞生。基于这一点&#xff0c;设计了一个消防网站&#xff0c;用来就…...

    2024/4/14 16:15:37
  16. 【Mysql】【高级篇】【第02章】Mysql数据目录

    本章对后续了解Mysql索引有所帮助&#xff0c;但不是重点章节&#xff1b; 1.Mysql8的主要目录结构 1.1 数据库文件的存放路径 1.1.1 windows系统 库目录 Mysql在安装的时候&#xff0c;配置文件中会指定Data目录&#xff0c;该目录下每一个目录代表一个数据库&#xff1b;…...

    2024/5/6 11:41:08
  17. 【报告分享】2022快手新市井商业内循环营销通案-磁力金牛(附下载)

    摘要:“市井向新、生意向上&#xff0c;短视频和直播让消失的市井重新回归。通过大数据、技术以及独特的单双列产品&#xff0c;快手形成了一个更包容、更高效、更具信任感的新市井商业生态。”在快手磁力引擎飞速发展的三年时光中&#xff0c;以短视频、直播、小店为框架迅速构…...

    2024/4/7 4:34:48
  18. 【渝粤教育】国家开放大学2018年秋季 1349T学前教育科研方法 参考试题

    科目编号&#xff1a;1358 座位号 2018-2019学年度第一学期期末考试 民族理论与民族政策 试题 2019年 1月 填空题&#xff08;每空2分&#xff0c;共16分&#xff09; 1.我国现有的五个自治区为&#xff1a;内蒙古自治区、新疆维吾尔族自治区、广西壮族自治区、、。 2.______…...

    2024/5/6 4:45:10
  19. 2022年黄石市工程系列中级初级专业技术职务水平能力测试通知

    2022年黄石市工程系列中级初级专业技术职务水平能力测试通知 2022年黄石市工程系列中级初级专业技术职务水平能力测试通知 2022年黄石市初级中级职称水平能力测试对象 简单的说&#xff0c;符合有关规定&#xff0c;是可以申报的。 申报初级水测&#xff1a;本科毕业1年&#…...

    2024/4/14 16:15:52
  20. 名企实习学历受限吗?IT名企实习看实力还是学历

    “内卷”一词起源于知名学霸一边骑车一边看书、看电脑和写论文&#xff0c;在学历界也开始内卷&#xff0c;越来越多的本科生通过“考研”或者“考证”提升名企实习通过率。那么名企实习学历真的受限吗?IT名企实习看实力还是学历呢? 从各大名企历年招聘来看&#xff0c;拿到…...

    2024/4/17 22:01:43

最新文章

  1. Failed to build flash-attn:ERROR: Could not build wheels for flash-attn

    安装 FlashAttention 的时候遇到报错&#xff1a; Failed to build flash-attn ERROR: Could not build wheels for flash-attn, which is required to install pyproject.toml-based projects可能是安装的版本与环境存在冲突吧&#xff0c;我的环境是&#xff1a; python 3.1…...

    2024/5/8 17:08:14
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 如何构建数据指标体系

    构建一套科学、完备且实用的数据分析指标体系是一项系统性的工程&#xff0c;其核心在于将业务理解、目标设定、度量标准选择、数据采集与整理、数据分析、指标体系构建、持续优化与改进等多个环节有机融合&#xff0c;以实现对业务状况的精准刻画、趋势预测及决策支持。以下是…...

    2024/5/8 11:23:02
  4. 从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍

    文章目录 前提ISA的基本介绍ISA是什么CISC vs RISCISA的宽度 RISC-V指令集RISC-V ISA的命名规范模块化的ISA通用寄存器Hart特权级别内存管理与保护异常和中断 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提…...

    2024/5/5 1:33:57
  5. spark on hive

    由于spark不存在元数据管理模块&#xff0c;为了能方便地通过sql操作hdfs数据&#xff0c;我们可以通过借助hive的元数据管理模块实现。对于hive来说&#xff0c;核心组件包含两个&#xff1a; sql优化翻译器&#xff0c;翻译sql到mapreduce并提交到yarn执行metastore&#xf…...

    2024/5/8 2:36:25
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57