彻底理解 AQS 我是懂了,你呢?
背景
早前写过一篇深入理解 AQS 的文章
彻底搞懂AQS
过了一段时间后,我发现有些地方记得不清楚了,而且之前写的也不好,所以我感觉其实理解的并不深入透彻,于是决定再好好找资料看一看,把之前一知半解的地方彻底弄清楚!
看文档
先看下源码, AbstractQueuedSynchronizer 这个类有代码+注释共有 2335 行,可以说很长,我们先看第一手资料即源码注释是怎么写的,通过 AbstractQueuedSynchronizer 类的注释提纲挈领地了解一下这个类。
类注释
这里就不贴英文原文了,比较长,直接上翻译内容:
本类提供了一个用于实现阻塞锁和同步器(信号量、事件等)的框架,该框架依赖先进先出 (FIFO) 的等待队列来实现。它为大多数通过单个 int 类型的原子值来表示状态的同步器提供了实现基础。子类必须重写更改同步器状态的 protected 方法,并定义该状态在获取或释放子类对象方面的具体含义。基于此,此类中的其他方法实现所有排队和阻塞机制。子类可以维护其他状态字段,但就同步而言,只有使用了方法 getState、 setState 和 compareAndSetState 操作以原子方式更新的 int 值才能够被跟踪。
子类应定义为非公共内部辅助类,用于实现其外部类的同步属性。AbstractQueuedSynchronizer 类没有实现任何同步接口。相反,它定义了诸如 acquireInterruptably 之类的方法,这些方法可以由具体锁和相关同步器适当调用以实现它们的公共方法。
此类默认支持独占模式和共享模式获取同步状态。当以独占模式获取同步状态时,其他线程尝试获取不会成功。共享模式下,多个线程获取同步状态一般(但不一定)会成功。这个类会忽略这两种模式在机制上的差异,那就是当线程在共享模式下成功获取到同步状态时,下一个等待的线程(如果存在)也必须确定它是否也可以获取该状态。
不同模式下的等待线程共享一个 FIFO 队列。
通常子类只实现一种模式,但两者可以同时工作,例如 ReadWriteLock。只支持一种模式的子类,无需再为另一种模式定义方法。
AQS 定义了一个内部类 ConditionObject,可以当做 Condition 的实例供支持独占模式的子类使用。在独占模式下,方法 #isHeldExclusively 用于表示当前线程是否在独占子类对象,以方法#getState 的返回值为入参,调用方法#release 可以完全释放子类对象。使用这个值调用#acquire 方法,最终恢复到前一个获取锁的状态。AbstractQueuedSynchronizer 中没有其他方法创建这个条件,所以如果不能满足这个约束,就不要使用它。AbstractQueuedSynchronizer.ConditionObject 的行为当然是基于它的实现类的语义。
该类为内部类提供了 检查/仪表化/监视 方法,以及类似的用于 condition 对象的方法。这些可以导出到使用 AbstractQueuedSynchronizer 作为同步机制的类中。该类的序列化仅仅存储原子整数的维护状态,所以反序列化对象得到的线程队列是空的。子类若需要序列化,要定义 readObject() 用于恢复自己到一个已知的初始状态。
用法:
若将该类用作同步器的基础,请使用 getState()/setState()/cas 这些用于检查或修改同步状态的方法对下面的方法进行重新定义:
-
tryAcquire
-
tryRelease
-
tryAcquireShared
-
tryReleaseShared
-
isHeldExclusively
这些方法默认抛出 UnsupportedOperationException, 这些方法内部必须保证线程安全,并且通常应该是简短且无锁的。定义这些方法是使用该类的意义所在。其他方法因为不能独立的变化,所以声明为 final。
你也能看到继承自 AbstractOwnableSynchronizer 的方法,用于跟踪那些独占了同步器的线程。鼓励你使用这些方法,它们开启了监视和诊断功能,可以帮助用户判断那些线程持有锁。
即使该类基于内部 FIFO 队列,但也不会执行默认的 FIFO 策略,独占同步的核心使用以下策略:
Acquire:while (!tryAcquire(arg)) {enqueue thread if it is not already queued;possibly block current thread;}Release:if (tryRelease(arg))unblock the first queued thread;
(共享模式类似,但可能涉及级联信号。)
因为对获取锁的检查是在入队之前进行,所以一个新线程可能会插入到其他已经入队的线程之前。不管咋地吧,你要是愿意,可以通过调用内部的一个或多个检查方法去定义 tryAcquire() / tryAcquireShared() 方法,从而提供一个公平的 FIFO 获取顺序。特别是,大多数公平同步器在 hasQueuedPredecessors()(这是一个专门设计用于公平同步器的)返回 true 的时候,让 tryAcquire() 返回 false. 当然,其他方法也有可能。
对于默认的插队策略(也叫 greedy/renouncement/convoy-avoidance), 吞吐量和可伸缩性通常最高。尽管这不能保证公平,但允许早入队的线程在后来的线程之前重新竞争,每个重新竞争的线程拥有公平的机会打败新来的线程。尽管获取行为通常不会一直进行,但线程在被阻塞之前,伴随着其他计算过程,他们可能会多次调用 tryAcquire(). 当独占同步器只是短暂的被持有时,这对于自旋来说很有好处,没有太多负担。你可以通过前面的调用增强这一点,以获得带有"fast-path"的方法。如果同步器可能没有被争夺,或许只会预先检查 hasContended() 和 hasQueuedThreads()。
这个类为同步提供了有效的可扩展的基础,部分原因是把范围集中在那些依赖数字状态、 获取/释放参数、 以及内部 FIFO 的同步器上。当这些不能满足需要时,你可以使用原子类、 你自己的 java.util.Queue 类、 LockSuppor 来构建更底层的同步器。
用法示例:
这是一个不可重入互斥锁,0 表示打开,1 表示锁定。虽然不可重入锁无需严格记录本地拥有者的线程,但这个类还是这么做了,以便更容易监视。同时也支持 conditions 并且公开了一个检测方法。
class Mutex implements Lock, java.io.Serializable {// Our internal helper classprivate static class Sync extends AbstractQueuedSynchronizer {// Acquires the lock if state is zeropublic boolean tryAcquire(int acquires) {assert acquires == 1; // Otherwise unusedif (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}// Releases the lock by setting state to zeroprotected boolean tryRelease(int releases) {assert releases == 1; // Otherwise unusedif (!isHeldExclusively())throw new IllegalMonitorStateException();setExclusiveOwnerThread(null);setState(0);return true;}// Reports whether in locked statepublic boolean isLocked() {return getState() != 0;}public boolean isHeldExclusively() {// a data race, but safe due to out-of-thin-air guaranteesreturn getExclusiveOwnerThread() == Thread.currentThread();}// Provides a Conditionpublic Condition newCondition() {return new ConditionObject();}// Deserializes properlyprivate void readObject(ObjectInputStream s)throws IOException, ClassNotFoundException {s.defaultReadObject();setState(0); // reset to unlocked state}}// The sync object does all the hard work. We just forward to it.private final Sync sync = new Sync();public void lock() {sync.acquire(1);}public boolean tryLock() {return sync.tryAcquire(1);}public void unlock() {sync.release(1);}public Condition newCondition() {return sync.newCondition();}public boolean isLocked() {return sync.isLocked();}public boolean isHeldByCurrentThread() {return sync.isHeldExclusively();}public boolean hasQueuedThreads() {return sync.hasQueuedThreads();}public void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}public boolean tryLock(long timeout, TimeUnit unit)throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(timeout));}
}
这是一个类似于 java.util.concurrent.CountDownLatch CountDownLatch 的闩锁类,只是它只需要一个信号即可触发。因为锁存器是非独占的,所以它使用共享的获取和释放方法。
class BooleanLatch {private static class Sync extends AbstractQueuedSynchronizer {boolean isSignalled() {return getState() != 0;}protected int tryAcquireShared(int ignore) {return isSignalled() ? 1 : -1;}protected boolean tryReleaseShared(int ignore) {setState(1);return true;}}private final Sync sync = new Sync();public boolean isSignalled() {return sync.isSignalled();}public void signal() {sync.releaseShared(1);}public void await() throws InterruptedException {sync.acquireSharedInterruptibly(1);}
}
如果对上面的翻译理解起来还是费劲,那还放那儿,等看完下面的,再回到上面看一遍就通透了。
看设计
AQS 本质上是一个 FIFO 的双向队列,线程被包装成结点的形式,基于自旋机制在队列中等待获取资源(这里的资源可以简单理解为对象锁)
总揽一下这个类,可以看到有两个内部类,剩下的就是一堆成员变量和成员方法。
设计思路
这是 AQS 的模型:
AQS 主要由三部分组成,state 同步状态、Node 组成的 CLH 队列、ConditionObject 条件变量(包含 Node 组成的条件单向队列)。
state 用 volatile 来修饰,保证了我们操作的可见性,所以任何线程通过 getState() 获得状态都是可以得到最新值,但是 setState() 无法保证原子性,因此 AQS 给我们提供了 compareAndSetState 方法利用底层 UnSafe 的 CAS 功能来实现原子性。
对于 AQS 来说,线程同步的关键是对 state 的操作,可以说获取、释放资源是否成功都是由 state 决定的,比如 state>0 代表可获取资源,否则无法获取,所以 state 的具体语义由实现者去定义,现有的 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 定义的 state 语义都不一样。
-
ReentrantLock 的 state 用来表示是否有锁资源,变量记录了锁的重入次数
-
ReentrantReadWriteLock 的 state 高 16 位代表读锁状态,低 16 位代表写锁状态
-
Semaphore 的 state 用来表示可用信号的个数
-
CountDownLatch 的 state 用来表示计数器的值
AQS 实现了两类队列,即 同步队列 和 条件队列。
同步队列服务于线程阻塞等待获取资源,而条件队列则服务于线程因某个条件不满足而进入等待状态。条件队列中的线程实际上已经获取到了资源,但是没有能够继续执行下去的条件,所以被打入条件队列并释放持有的资源,以让渡其它线程执行,如果未来某个时刻条件得以满足,则该线程会被从条件队列转移到同步队列,继续参与竞争资源,以继续向下执行。
同步队列
CLH
同步队列是基于链表实现的双向队列,也是 CLH 锁的变种。CLH 锁是 AQS 队列同步器实现的基础。
来看一下 CLH 队列
-
CLH 锁是有由 Craig, Landin, and Hagersten 这三个人发明的锁,取了三个人名字的首字母,所以叫 CLH Lock。
-
CLH 锁是一个自旋锁。能确保无饥饿性。提供先来先服务的公平性。
-
CLH 队列锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程仅仅在本地变量上自旋,它不断轮询前驱的状态,假设发现前驱释放了锁就结束自旋。
Node
AQS 以内部类 Node
的形式定义了同步队列结点。这就是前文看到的第一个内部类。
static final class Node {/** 模式定义 */static final Node SHARED = new Node();static final Node EXCLUSIVE = null;/** 线程状态 */static final int CANCELLED = 1;static final int SIGNAL = -1;static final int CONDITION = -2;static final int PROPAGATE = -3;/** 线程等待状态 */volatile int waitStatus;/** 前驱结点 */volatile Node prev;/** 后置结点 */volatile Node next;/** 持有的线程对象 */volatile Thread thread;/** 对于独占模式而言,指向下一个处于 CONDITION 等待状态的结点;对于共享模式而言,则为 SHARED 结点 */Node nextWaiter;// ... 省略方法定义
}
Node 在 CLH 的基础上进行了变种。CLH 是单向队列,其主要特点是自旋检查前驱节点的 locked 状态。而 AQS 同步队列是双向队列,每个节点也有状态 waitStatus,而其并不是一直对前驱节点的状态自旋判断,而是自旋一段时间后阻塞让出 cpu 时间片(上下文切换),等待前驱节点主动唤醒后继节点。
waitStatus 有如下 5 中状态:
-
CANCELLED = 1 表示当前结点已取消调度。当超时或被中断(响应中断的情况下),会触发变更为此状态,进入该状态后的结点将不会再变化。
-
SIGNAL = -1 表示后继结点在等待当前结点唤醒。后继结点入队时,会将前继结点的状态更新为 SIGNAL。
-
CONDITION = -2 表示结点等待在 Condition 上,当其他线程调用了 Condition 的 signal() 方法后,CONDITION 状态的结点将从等待队列转移到同步队列中,等待获取同步锁。
-
PROPAGATE = -3 共享模式下,前继结点不仅会唤醒其后继结点,同时也可能会唤醒后继的后继结点。
-
INITIAL = 0 新结点入队时的默认状态。
从上面的代码中可以看出,位于 CLH 链表中的线程以 2 种模式在等待资源,即 SHARED 和 EXCLUSIVE,其中 SHARED 表示共享模式,而 EXCLUSIVE 表示独占模式。共享模式与独占模式的主要区别在于,同一时刻独占模式只能有一个线程获取到资源,而共享模式在同一时刻可以有多个线程获取到资源。典型的场景就是读写锁,读操作可以有多个线程同时获取到读锁资源,而写操作同一时刻只能有一个线程获取到写锁资源,其它线程在尝试获取资源时都会被阻塞。
同步队列主要行为
AQS 类成员变量 head 和 tail 字段分别指向同步队列的头结点和尾结点:
/*** Head of the wait queue, lazily initialized. Except for* initialization, it is modified only via method setHead. Note:* If head exists, its waitStatus is guaranteed not to be* CANCELLED.*/private transient volatile Node head;/*** Tail of the wait queue, lazily initialized. Modified only via* method enq to add new wait node.*/private transient volatile Node tail;
其中 head 表示同步队列的头结点,而 tail 则表示同步队列的尾结点,具体组织形式如下图:
当调用 AQS 的 acquire 方法获取资源时,如果资源不足则当前线程会被封装成 Node 结点添加到同步队列的末端(入队),头结点 head 用于记录当前正在持有资源的线程结点,而 head 的后继结点就是下一个将要被调度的线程结点,当 release 方法被调用时,该结点上的线程将被唤醒(出队),继续获取资源。
同步队列的主要行为是 :入队、出队
入队
获取资源失败的线程需要封装成 Node 节点,接着尾部入队,在 AQS 中提供 addWaiter 函数完成 Node 节点的创建与入队。添加节点的时候,如 CLH 队列已经存在,通过 CAS 快速将当前节点添加到队列尾部,如果添加失败或队列不存在,则初始化同步队列。
/*** Creates and enqueues node for current thread and given mode.** @param mode Node.EXCLUSIVE for exclusive, Node.SHARED for shared* @return the new node*/
private Node addWaiter(Node mode) {Node node = new Node(mode);for (;;) {Node oldTail = tail;if (oldTail != null) {node.setPrevRelaxed(oldTail);if (compareAndSetTail(oldTail, node)) {oldTail.next = node;return node;}} else {initializeSyncQueue();}}
}
总结:入队列,线程获取锁失败,入队列将新节点加到 tail 后面,然后对 tail 进行 CAS 操作,将 tail 指针后移到新节点上。
出队
CLH 队列中的节点都是获取资源失败的线程节点,当持有资源的线程释放资源时,会将 head.next 指向的线程节点唤醒(C L H 队列的第二个节点),如果唤醒的线程节点获取资源成功,线程节点清空信息设置为头部节点(新哨兵节点),原头部节点出队(原哨兵节点)
protected final boolean tryRelease(int releases) {int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free = false;if (c == 0) { // 如果 state=0 了,就是可以释放锁了free = true; setExclusiveOwnerThread(null); // 将拿锁线程置为 null}setState(c); // 重置同步器的 statereturn free; // 返回是否成功释放}private void unparkSuccessor(Node node) {// node 节点是当前释放锁的节点,也是同步队列的头节点int ws = node.waitStatus;// 如果节点已经被取消了,把节点的状态置为初始化if (ws < 0)compareAndSetWaitStatus(node, ws, 0);// 拿出队二 sNode s = node.next;// s 为空,表示 node 的后一个节点为空// s.waitStatus 大于 0,代表 s 节点已经被取消了// 遇到以上这两种情况,就从队尾开始,向前遍历,找到第一个 waitStatus 字段不是被取消的if (s == null || s.waitStatus > 0) {s = null;// 结束条件是前置节点就是 head 了for (Node t = tail; t != null && t != node; t = t.prev)// t.waitStatus <= 0 说明 t 当前没有被取消,肯定还在等待被唤醒if (t.waitStatus <= 0)s = t;}// 唤醒以上代码找到的线程if (s != null)LockSupport.unpark(s.thread);
}
当线程被唤醒后,又继续执行 acquireQueued 方法,进入循环
/*** Acquires in exclusive uninterruptible mode for thread already in* queue. Used by condition wait methods as well as acquire.** @param node the node* @param arg the acquire argument* @return {@code true} if interrupted while waiting*/
final boolean acquireQueued(final Node node, int arg) {boolean interrupted = false;try {for (;;) {//获取前驱节点final Node p = node.predecessor();//如果前驱节点是首节点,获取资源(子类实现)if (p == head && tryAcquire(arg)) {//获取资源成功,设置当前节点为头节点,清空当前节点的信息,把当前节点变成哨兵节点setHead(node);//原来首节点下个节点指向为 nullp.next = null; // help GC//返回线程中断状态return interrupted;}if (shouldParkAfterFailedAcquire(p, node))interrupted |= parkAndCheckInterrupt();}} catch (Throwable t) {cancelAcquire(node);if (interrupted)selfInterrupt();throw t;}
}
总结:出队列,锁释放唤醒 head 的后继节点,head 的后继节点从阻塞中醒来,开始抢锁,获取锁成功,此时 head 指针向后移一个位置,原先 head 的后继节点成为新的 head。
最后是一个 同步队列的流程概述
条件队列
一个 AQS 可以对应多个条件变量
ConditionObject 内部维护着一个单向条件队列,不同于 CLH 队列,条件队列只入队执行 await 的线程节点,并且加入条件队列的节点,不能在 CLH 队列, 条件队列出队的节点,会入队到 CLH 队列。
当某个线程执行了 ConditionObject 的 await 函数,阻塞当前线程,线程会被封装成 Node 节点添加到条件队列的末端,其他线程执行 ConditionObject 的 signal 函数,会将条件队列头部线程节点转移到 CLH 队列参与竞争资源,具体流程如下图:
一个 Condition 对象就有一个单项的等待任务队列。在一个多线程任务中我们可以 new 出多个等待任务队列。比如我们 new 出来两个等待队列。
private Lock lock = new ReentrantLock();private Condition FirstCond = lock.newCondition();private Condition SecondCond = lock.newCondition();
所以真正的 AQS 任务中一般是一个任务队列 N 个等待队列的,因此我们尽量调用 signal 而少用 signalAll,因为在指定的实例化等待队列中只有一个可以拿到锁的。
设计模式
从设计模式的角度讲,AbstractQueuedSynchronizer 是个抽象类,所有用到方法的类都要继承此类的若干方法,对应的设计模式就是模版模式。这样就解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作。
若干方法就是上文注释翻译中描述的这些方法:
-
tryAcquire
-
tryRelease
-
tryAcquireShared
-
tryReleaseShared
-
isHeldExclusively
说明一下各个方法的作用:
-
tryAcquire :尝试以独占模式获取资源,如果获取成功则返回 true,否则返回 false。
-
tryRelease :尝试以独占模式释放资源,如果释放成功则返回 true,否则返回 false。
-
tryAcquireShared :尝试以共享模式获取资源,如果返回正数则说明获取成功,且还有可用的剩余资源;如果返回 0 则说明获取成功,但是没有可用的剩余资源;如果返回负数则说明获取资源失败。
-
tryReleaseShared :尝试以共享模式释放资源,如果释放成功则返回 true,否则返回 false。
-
isHeldExclusively :判断当前线程是否正在独占资源,如果是则返回 true,否则返回 false。
AbstractQueuedSynchronizer 中的方法实现按照功能划分可以分为两大类,即获取资源(acquire)和释放资源(release),同时区分独占模式和共享模式
可以看到具体实现类需要对资源在不同模式下的获得和释放进行具体定义。具体实现举例来说可以到 ReentrantReadWriteLock 中的 内部类 Sync 看一下。
持锁的当前线程:exclusiveOwnerThread
自实现
AQS 定义了一套多线程访问共享资源的同步模板,解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作,现在我们基于 AQS 实现一个不可重入的独占锁,直接使用 AQS 提供的独占式模板,只需明确 state 的语义与实现 tryAcquire 与 tryRelease 函数(获取资源与释放资源)。在这里 state 为 0 表示锁没有被线程持有,state 为 1 表示锁已经被某个线程持有,由于是不可重入锁,所以不需要记录持有锁线程的获取锁次数。
不可重入的独占锁代码如下
public class NonReentrantLock implements Lock {/*** * @Description 自定义同步器*/private static class Sync extends AbstractQueuedSynchronizer {/*** 锁是否被线程持有*/@Overrideprotected boolean isHeldExclusively() {//0:未持有 1:已持有return super.getState() == 1;}/*** 获取锁*/@Overrideprotected boolean tryAcquire(int arg) {if (arg != 1) {//获取锁操作,是需要把 state 更新为 1,所以 arg 必须是 1throw new RuntimeException("arg not is 1");}if (compareAndSetState(0, arg)) {//cas 更新 state 为 1 成功,代表获取锁成功//设置持有锁线程setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}/*** 释放锁*/@Overrideprotected boolean tryRelease(int arg) {if (arg != 0) {//释放锁操作,是需要把 state 更新为 0,所以 arg 必须是 0throw new RuntimeException("arg not is 0");}//清空持有锁线程setExclusiveOwnerThread(null);//设置 state 状态为 0,此处不用 cas,因为只有获取锁成功的线程才会执行该函数,不需要考虑线程安全问题setState(arg);return true;}/*** 提供创建条件变量入口*/public ConditionObject createConditionObject() {return new ConditionObject();}}private final Sync sync = new Sync();/*** 获取锁*/@Overridepublic void lock() {//Aqs 独占式-获取资源模板函数sync.acquire(1);}/*** 获取锁-响应中断*/@Overridepublic void lockInterruptibly() throws InterruptedException {//Aqs 独占式-获取资源模板函数(响应线程中断)sync.acquireInterruptibly(1);}/*** 获取锁是否成功-不阻塞*/@Overridepublic boolean tryLock() {//子类实现return sync.tryAcquire(1);}/*** 获取锁-超时机制*/@Overridepublic boolean tryLock(long time, TimeUnit unit) throws InterruptedException {//Aqs 独占式-获取资源模板函数(超时机制)return sync.tryAcquireNanos(1,unit.toNanos(time));}/*** 释放锁*/@Overridepublic void unlock() {//Aqs 独占式-释放资源模板函数sync.release(0);}/*** 创建条件变量*/@Overridepublic Condition newCondition() {return sync.createConditionObject();}
}
NonReentrantLock 定义了一个内部类 Sync,Sync 用来实现具体的锁操作,它继承了 AQS,因为使用的是独占式模板,所以重写 tryAcquire 与 tryRelease 函数,另外提供了一个创建条件变量的入口,下面使用自定义的独占锁来同步两个线程对 j++。
private static int j = 0;public static void main(String[] agrs) throws InterruptedException {NonReentrantLock nonReentrantLock = new NonReentrantLock();Runnable runnable = () -> {//获取锁nonReentrantLock.lock();for (int i = 0; i < 100000; i++) {j++;}//释放锁nonReentrantLock.unlock();};Thread thread = new Thread(runnable);Thread threadTwo = new Thread(runnable);thread.start();threadTwo.start();thread.join();threadTwo.join();System.out.println(j);}无论执行多少次输出内容都是:
200000
其他
LockSupport 辅助类
LockSupport 是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。
park 是因为 park 英文意思为停车。我们如果把 Thread 看成一辆车的话,park 就是让车停下,unpark 就是让车启动然后跑起来。
park/unpark 调用的是 Unsafe(提供 CAS 操作) 中的 native 代码。
说明
本文参考了非常多网络图片和文章资料,严格意义上已经不算原创文章了,如本文引有的内容有侵权,请联系删除。
参考
-
https://blog.csdn.net/lpf463061655/article/details/87290730
-
https://www.codenong.com/cs106963035/
-
https://mp.weixin.qq.com/s/bxWgo9IuggDpE1l37JqEhQ
-
https://www.modb.pro/db/108644
-
https://mp.weixin.qq.com/s/BLnZYa4lbXUx3KEQm7Z7tA
-
https://mp.weixin.qq.com/s/Y4GbMdNmSDvHtomxtObRSg
-
https://www.baiyp.ren/CLH%E9%98%9F%E5%88%97%E9%94%81.html
-
https://juejin.cn/post/6873020483755884552
-
https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247488891&idx=1&sn=227928446c692aaa0085557682ed732d&scene=21#wechat_redirect
小盒子的技术分享
有关编程、技术类知识的分享及生活感悟
82篇原创内容
公众号
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 计算机专业的学生怎么可以连计算机发展史都不知道
「作者主页」:士别三日wyx 计算机的发展一、第一台计算机1)计算机系统2)第一台计算机3)计算机识别二进制数据的原理二、硬件的发展第一代:电子管时代第二代:晶体管时代第三代:中小规模集成电路时…...
2024/4/16 17:49:08 - 2021年为什么这么多人劝退Android开发,学习正确姿势是什么?
前言 刚来的也别害怕,其实这也是内卷的一种形式,把你吓跑了,行业内的人就能多点时间休息,不然内卷就会加剧,自己的日子也就越来越难混;还有些不思进取所谓的Android前辈,被自己同事屌ÿ…...
2024/4/16 8:19:27 - 为什么String要设计成不可变的?
这是一个老生常谈的话题(This is an old yet still popular question). 在Java中将String设计成不可变的是综合考虑到各种因素的结果,想要理解这个问题,需要综合内存,同步,数据结构以及安全等方面的考虑. 在下文中,我将为各种原因做一个小结。 1. 字符串常量池的需要 字符串常…...
2024/4/15 7:23:32 - 加速AI开发与部署,有这套速查表就够了
摘要:AI 开发者不容错过 OpenVINO™工具套件入门速查表。 从模型优化到开发部署 从性能基准到最佳实践 讲了那么久的 OpenVINO™工具套件 想必很多人对其理解与好感度蹭蹭上涨 最完备的入门指南 最详细的资源整理 来了! 从哪入门,怎么训练…...
2024/4/17 21:57:11 - 1462B - Codeforces(寻找2020)
题目链接: Problem - 1462B - Codeforces 本蒟蒻又来献丑了,这道题我做的时候还不会C,STL只想到了用C硬钢,所以有点冗长。 题目大意: 现在给你一个数字字符串,问能不能只删除这个字符串的子链一次而得到…...
2024/4/19 20:40:30 - MMdetection 训练工具使用
1、安装依赖 Linux or macOS(Window is in experimentail support)Python 3.6+pytorch 1.3+cuda9.2+gcc 5+mmcv(importly)注意:mmcv 的版本要和下载的mmdetection 版本对应哦! (建议在安装mmdetection之前,先把pytorch和mmcv单独安装好,mmcv直接用命令安装即可“pip inst…...
2024/4/19 19:55:29 - CAD打印后图形不显示?
在CAD软件中,颜色一般分为索引颜色和真彩色。索引颜色是常用的255种颜色,并以【1-255】不同的编号来代表不同的颜色。真彩色是指将红绿蓝RGB三色分成0-255级(8位,也就是2的8次方)组合成24位(2的24次方&…...
2024/4/18 21:23:16 - wdk10+vs2019开发win7驱动注意事项
用之前的vs2019配置开发win7驱动蓝屏了,于是看了看只需要设置两个点就能在win7运行...
2024/4/18 17:41:14 - 【MySQL附录】A6:MySQL OCP 认证考试最详细最准确报考流程(2020年)
Oracle将MySQL纳入旗下后,也参照Oracle数据库,推出针对MySQL的OCP认证(目前MySQL没有OCM级别)。MySQL8.0软件在2018年4正式发布后,终于在2020年1月底,Oracle官网挂出了8.0的OCP 1Z0-908 考试初步信息,但是在3月份才能在VUE网站看查到考试安排。经查VUE网站,北京最早能约…...
2024/4/18 17:39:56 - Element ui Dialog弹出框随屏幕大小变化而变化
一般我们引用Dialog弹出框时,弹出框的大小都是用width"30%"这样来设置,这样的话我们在缩小屏幕的时候弹出框就会根据你缩小屏幕的宽度的百分比来设置,这样你弹出框里面的东西就会溢出,如果你不想溢出就把宽度写成width&…...
2024/4/9 17:51:36 - js基础-题目11
准备找工作了,整理下之前做的有点疑惑的js基础题目和大家分享以下,如果大家觉得有用,别忘了点一下赞哦 定时器的this指向 var x 4 var obj {x: 3,bar: function () {var x 2setTimeout(function () {var x 1console.log(this.x)//4}, 1…...
2024/4/15 7:23:22 - 自定义java序列化实现@JsonSerialize注解
做项目的时候,我给前端提供了一个查询列表的接口,但是随着数据的增加运行会变得很慢。通过计时器监控发现是序列化的时候特别费时间(我的实体里有很多关联表)。 解决这个问题可以用JsonSerialize注解,我来总结一下Json…...
2024/4/20 8:55:22 - 地理信息系统实习教程 第24章 选址与配置
...
2024/4/20 13:37:25 - nodejs安装
官网:下载 | Node.js 中文网 (nodejs.cn)http://nodejs.cn/download/current/...
2024/4/15 7:24:32 - C++57个入门知识点_45 友元的实现及作用
1.友元的作用 通过友元的使用,可以使用另一个类的私有成员,打破私有成员的私有性(破坏了封装性),在必要的情况下才会使用。 2.友元的基本形式 形式有三种: //1.普通的友元函数 //2.友元成员函数 //3.友元类…...
2024/4/15 12:49:49 - React项目中遇到的问题
营销中心后台管理系统 1.译为:由’ useForm ‘创建的实例没有连接到任何Form元素。 忘记传递’ form 道具? Instance created by useForm is not connected to any Form element. Forget to pass form prop? 解决方法:form{form} <Form form{form}…...
2024/4/15 7:24:37 - 蓝牙/BLE基本知识梳理
蓝牙基本知识梳理 带宽/符号率/数据率/PHY 带宽是每个信道占用的频率范围, 符号率(Symbol Rate,单位s/s),符号率每个周期传输的符号个数 数据率(Data Rate,b/s)是每个周期传输的数据(以bit为单位)个数 PHY是指物理层 传统蓝牙都…...
2024/4/7 0:04:14 - Diagnostic Log and Trace——开发人员如何使用 DLT
DLT 示例应用 要在应用程序中使用 DLT,它必须链接到 DLT 库。在系统上安装 DLT 守护程序后,将有一个名为 libdlt.so 的共享库,它为应用程序提供接口以获取与 DLT 守护程序的连接。在使用共享 dlt 库构建程序之前,必须在构建环境中…...
2024/4/15 7:24:17 - CF955C Sad powers
题目大意 给你 qqq 个询问,每次询问 [l,r][l,r][l,r] 这个区间内满足 xap(a>0,p>1)xa^p(a>0,p>1)xap(a>0,p>1) 的 xxx 的数量。 1⩽q⩽1051⩽q⩽10^51⩽q⩽105,1⩽l⩽r⩽10181\leqslant l\leqslant r\leqslant 10^{18}1⩽l⩽r⩽1018。…...
2024/4/15 7:24:37 - java.lang.NoClassDefFoundError: com/alipay/api/CertAlipayRequest问题
1、起因 使用支付宝证书方式验正支付时报java.lang.NoClassDefFoundError: com/alipay/api/CertAlipayRequest 2、经过 经过检查发现是因为启动的maven项目未使用我最新导入的jar包(maven依赖冲突)。所以导致找不到相关的类 3、解决方法 使用depend…...
2024/4/15 7:24:17
最新文章
- 数据仓库作业五:第8章 关联规则挖掘
目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d},试求出由 X X X 导出的所有关联规则。 解: 首先生成项集的所有非空真子集。这包括: { a } , { b } , { c } , {…...
2024/4/20 19:51:14 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - Java插值查找知识点(含面试大厂题和源码)
插值查找(Interpolation Search)是一种改进的二分查找算法,适用于数据分布均匀的有序数组。插值查找的基本思想是,根据要查找的关键字与数组的最大值和最小值之间的比例,预测关键字可能存在的位置,从而跳过…...
2024/4/16 3:14:43 - 软考中级(网络工程师考核要点)第一章 计算机网络系统(信道特性应用)第七期(多路复用技术、差错控制)
1. 分析:每个样本量为256个等级,用二进制表示每个样本量,256,也就是有8个信道,本题并不需要考虑到信道宽,就不需要用信道宽,将125微秒换算成0.000125秒,然后将8个信道除采样周期0.00…...
2024/4/18 12:55:36 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/19 14:24:02 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/19 18:20:22 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/19 11:57:31 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/19 11:57:31 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/19 11:57:52 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/19 11:57:53 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/19 11:58:14 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/19 11:58:20 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/20 7:40:48 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/19 11:58:39 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/19 11:58:51 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/20 3:12:02 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/19 11:59:15 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/19 11:59:23 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/19 11:59:44 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/19 11:59:48 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/19 12:00:06 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/19 16:57:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/19 12:00:25 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/19 12:00:40 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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