synchronized原理剖析与优化
并发编程的三个问题
- 可见性
- 原子性
- 有序性
缓存
CPU的运算速度和内存的访问速度相差比较大。这就导致CPU每次操作内存都要耗费很多等待时间。内存的读写速度成为了计算机运行的瓶颈。于是就有了在CPU和主内存之间增加缓存的设计。最靠近CPU的缓存称为L1,然后依次是L2,L3和主内存,CPU缓存模型如图下图所示:
CPU Cache分成了三个级别: L1, L2, L3。级别越小越接近CPU,速度也更快,同时也代表着容量越小。1. L1是最接近CPU的,它容量最小,例如32K,速度最快,每个核上都有一个L1 Cache。2. L2 Cache 更大一些,例如256K,速度要慢一些,一般情况下每个核上都有一个独立的L2 Cache。3. L3 Cache是三级缓存中最大的一级,例如12MB,同时也是缓存中最慢的一级,在同一个CPU插槽之间的核共享一个L3 Cache。
Cache的出现是为了解决CPU直接访问内存效率低下问题的,程序在运行的过程中,CPU接收到指令后,它会最先向CPU中的一级缓存(L1 Cache)去寻找相关的数据,如果命中缓存,CPU进行计算时就可以直接对CPU Cache中的数据进行读取和写人,当运算结束之后,再将CPUCache中的最新数据刷新到主内存当中,CPU通过直接访问Cache的方式替代直接访问主存的方式极大地提高了CPU 的吞吐能力。但是由于一级缓存(L1 Cache)容量较小,所以不可能每次都命中。这时CPU会继续向下一级的二级缓存(L2 Cache)寻找,同样的道理,当所需要的数据在二级缓存中也没有的话,会继续转向L3Cache、内存(主存)和硬盘。
Java内存模型——JMM
内存模型概念
Java内存模型是一套规范,描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节,主要实现是synchronized和volatile,具体如下:
- 主内存:主内存是所有线程都共享的,都能访问的,所有的共享变量都存储于主内存,例如静态成员变量等
- 工作内存:每一个线程有自己的工作内存,工作内存只存储该线程对共享变量的副本。线程对变量的所有的操作(读,取)都必须在工作内存中完成,而不能直接读写主内存中的变量,不同线程之间也不能直接访问对方工作内存中的变量
内存模型与CPU架构关系
主内存与工作内存间的交互
Java内存模型中定义了以下8种原子操作来完成,主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的,对应如下的流程图:
lock->read->load->use->assign->store->write->unlock
注意:
- 如果对一个变量执行lock操作,将会清空工作内存中此变量的值
- 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中
synchronized作用
能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
synchronized的两种用法
对象锁:
- 方法锁(锁的是this)
- 同步代码块
类锁:
- 修饰静态方法(锁的是class对象)
- 指定锁为Class对象
如果不是static,则被synchronized修饰的方法,两个实例调用不是一把锁
Java对象的布局
synchronized控制粒度
粒度∶线程而非调用(用3种情况来说明和 pthread(调用)的区别),只要线程拿到了锁,访问其他的方法需要的是这同一把锁,就不需要再去获取这把锁
- 情况1:证明同一个方法是可重入的(synchronized方法调用本身)
- 情况2:证明可重入不要求是同一个方法(synchronized方法调用另一个synchronized方法)
- 情况3:证明可重入不要求是同一个类中的(synchronized方法调用其他类的synchronized方法)
synchronized的特性
可重入性质
什么是可重入(递归锁):指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁。类似牌照摇号,可重入就是拿到之后就可以再次用起来,可以一直摇号,如果还需要重新竞争的话就叫不可重入锁
可重入有什么好处:
- 避免死锁:如果不可重入就会一直等待锁,很容易造成死锁
- 提升封装性:同步代码块可以调用另一个同步代码块
synchronized的锁对象中有一个计数器(recursions变量)会记录线程获得几次锁,在执行完同步代码块时,计数器的数量会-1,知道计数器的数量为0,就释放这个锁
不可中断性质
一旦这个锁已经被别人获得了,如果我还想获得,我只能选择等待或者阻塞,直到别的线程释放这个锁,如果别人永远不释放锁那么我只能永远地等下去。
相比之下,未来会介绍的Lock类,可以拥有被中断的能力,这有两点体现:
- 如果我觉得我等待的时间太长了不想再等了,可以退出阻塞——tryLock
synchronized功能实现
保证原子性
synchronized保证只有一个线程拿到锁,能够进入同步代码块。
保证可见性
通过JMM(Java内存模型)进行控制,执行synchronized时,会对应lock原子操作会刷新工作内存中共享变量的值,例如println就用到了synchronized修饰
保证有序性
我们加synchronized后,依然会发生重排序,只不过我们有同步代码块,可以保证只有一个线程执行同步代码中的代码,保证有序性
synchronized的工作原理
JVM 中的同步是基于进入和退出管程(Monitor)对象实现的。每个对象实例都会有一个 Monitor,Monitor 可以和对象一起创建、销毁。
当多个线程同时访问一段同步代码时,多个线程会先被存放在EntryList集合
(也可称为阻塞队列
)中,处于BLOCKED
状态的线程,都会被加入到该列表。
接下来当线程获取到对象的 Monitor 时,Monitor 是依靠底层操作系统的 Mutex Lock 来实现互斥的,线程申请 Mutex 成功,则持有该 Mutex,其它线程将无法获取到该 Mutex。
如果线程调用 wait() 方法,就会释放当前持有的 Mutex,并且该线程会进入WaitSet集合
(也可称为等待队列
)中,等待下一次被唤醒。此时线程会处于WAITING
或者TIMEDWAITING
状态,
如果当前线程顺利执行完方法,也将释放 Mutex。
总的来说,就是同步锁在这种实现方式中,因 Monitor 是依赖于底层的操作系统实现,存在用户态
与内核态
之间的切换(可以理解为上下文切换
),所以增加了性能开销。
synchronized底层原理
monitor
synchronized的锁对象会关联一个monitor(c++层面的),它才是真正的锁,这个monitor不是我们主动创建的,是JVM的线程执行到这个同步代码块发现锁对象没有monitor就会创建monitor。monitor内部有两个重要的成员变量:
- owner:拥有这把锁的线程
- recursions:会记录线程拥有锁的次数,当一个线程拥有monitor后其他线程只能等待
monitorenter
监视器被占用时会被锁住,其他线程无法来获取该monitor。当JVM执行某个线程的某个方法内部的monitorenter时,它会尝试去获取当前对象对应的monitor的所有权,其过程如下:
- 若monior的进入数为0,线程可以进入monitor,并将monitor的进入数置为1,当前线程成为monitor的owner(所有者)
- 若线程已拥有monitor的所有权,允许它重入monitor,则进入monitor的进入数加1
- 若其他线程已经占有monitor的所有权,那么当前尝试获取monitor的所有权的线程会被阻塞,直到monitor的进入数变为0,才能重新尝试获取monitor的所有权
monitorexit
-
能执行monitorexit指令的线程一定是拥有当前对象的monitor的所有权的线程。
-
执行monitorexit时会将monitor的进入数减1。当monitor的进入数减为0时,当前线程退出monitor,不再拥有monitor的所有权,此时其他被这个monitor阻塞的线程可以尝试去获取这个monitor的所有权
-
monitorexit插入在方法结束处和异常处,JVM保证每个monitorenter必须有对应的monitorexit,因此
synchroznied出现异常会释放锁
同步方法
可以看到同步方法在反汇编后,会增加ACC_SYNCHRONIZED
修饰。会隐式调用monitorenter和monitorexit。在执行同步方法前会调用monitorenter,在执行完同步方法后会调用monitorexit
深入monitor的JVM源码
monitor的结构
在HotSpot虚拟机中,monitor是由ObjectMonitor实现的。其源码是用c++来实现的,位于HotSpot虚拟机源码ObjectMonitor.hpp文件中(src/share/vm/runtime/objectMonitor.hpp),ObjectMonitor主要数据结构如下:
ObjectMonitor(){_header=NULL;_count=0;_waiters=0;_recursions=0;//线程的重入次数_object=NULL;//存储该monitor的对象_owner=NULL;//标识拥有该monitor的线程_WaitSet=NULL;//处于wait状态的线程,会被加入到_WaitSet_WaitSetLock=0;_Responsible=NULL;_succ=NULL;_cxq=NULL;//多线程竞争锁时的单向列表FreeNext=NULL;_EntryList=NULL;//处于等待锁block状态的线程,会被加入到该列表_SpinFreq=0;_SpinClock=0;OwnerIsThread=0;
}
- _owner:初始时为NULL。当有线程占有该monitor时,owner标记为该线程的唯一标识。当线程释放monitor时,owner又恢复为NULL。owner是一个临界资源,JVM是通过CAS操作来保证其线程安全的
- _cxq:竞争队列,所有请求锁的线程首先会被放在这个队列中(单向链接)。_cxq是一个临界资源,JVM通过CAS原子指令来修改_cxq队列。修改前_cxq的旧值填入了node的next字段,_cxq指向新值(新线程),因此_cxq是一个后进先出的stack(栈)
- _EntryList:_cxq队列中有资格成为候选资源的线程会被移动到该队列中
- _WaitSet:因为调用wait方法而被阻塞的线程会被放在该队列中
当owner释放锁之后,下一个抢占线程可能来自EntryList,也可能来自WaitSet
monitor竞争
- 通过CAS尝试把monitor的owner字段设置为当前线程
- 如果设置之前的owner指向当前线程,说明当前线程再次进入monitor,即重入锁,执行recursions ++ ,记录重入的次数
- 如果当前线程是第一次进入该monitor,设置recursions为1,_owner为当前线程,该线程成功获得锁并返回
- 如果获取锁失败,则等待锁的释放。
monitor等待
- 当前线程被封装成ObjectWaiter对象node,状态设置成ObjectWaiter::TS_CXQ
- 在for循环中,通过CAS把node节点push到_cxq列表中,同一时刻可能有多个线程把自己的node节点push到_cxq列表中
- node节点push到_cxq列表之后,通过自旋尝试获取锁,如果还是没有获取到锁,则通过park将当前线程挂起,等待被唤醒
- 当该线程被唤醒时,会从挂起的点继续执行,通过ObjectMonitor::TryLock尝试获取锁。
monitor释放
- 退出同步代码块时会让_recursions减1,当_recursions的值减为0时,说明线程释放了锁
- 根据不同的策略(由QMode指定),从cxq或EntryList中获取头节点,通过ObjectMonitor::ExitEpilog方法唤醒该节点封装的线程,唤醒操作最终由unpark完成
- 被唤醒的线程,会回到voidATTRObjectMonitor::EnterI(TRAPS)的第600行,继续执行monitor的竞争
monitor是重量级锁
可以看到ObjectMonitor的函数调用中会涉及到Atomic::cmpxchg_ptr,Atomic::inc_ptr等内核函数,执行同步代码块,没有竞争到锁的对象会park()被挂起,竞争到锁的线程会unpark()唤醒
这个时候就会存在操作系统用户态和内核态的转换,这种切换会消耗大量的系统资源。所以synchronized是Java语言中是一个重量级(Heavyweight)的操作
JDK 6的synchronized优化
为什么要进行锁升级
在Java早期版本中,synchronized属于重量级锁,效率低下,因为操作系统实现线程之间的切换时需要从用户态转换到核心态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高
为了提升性能,JDK1.6 引入了偏向锁、轻量级锁、重量级锁概念,来减少锁竞争带来的上下文切换,而正是新增的Java对象头实现了锁升级功能。
synchronized锁升级过程
锁升级过程:无锁–>偏向锁–>轻量级锁–>重量级锁,synchronized同步锁初始为偏向锁,随着线程竞争越来越激烈,偏向锁自旋升级到轻量级锁,最终升级到重量级锁
synchronized优化——偏向锁
升级场景
hotspot虚拟机的作者经过调查发现,大部分情况下,加锁的代码不仅仅不存在多线程竞争,而且总是由同一个线程多次获得。所以基于这样一个概率,我们一开始加锁上的是偏向锁,当一个线程访问加了同步锁的代码块时,首先会尝试通过CAS操作在对象头中存储当前线程的ID
- 如果成功markword则存储当前线程ID,接着执行同步代码块
- 如果是同一个线程加锁的时候,不需要争用,只需要判断线程指针是否同一个,可直接执行同步代码块
- 如果有其他线程已经获得了偏向锁,这种情况说明当前锁存在竞争,需要撤销已获得偏向锁的线程,并且把它持有的锁升级为轻量级锁(这个操作需要等到全局安全点,也就是没有线程在执行字节码)才能执行
升级优点
偏向锁主要用来优化同一线程多次申请同一个锁的竞争,也就是现在的Synchronized锁实际已经拥有了可重入锁的功能。
为什么要有偏向锁
因为在我们的应用中,可能大部分时间是同一个线程竞争锁资源(比如单线程操作一个线程安全的容器),如果这个线程每次都要获取锁和释放锁,那么就在不断的从内核态与用户态之间切换。
那么有了偏向锁,当一个线程再次访问这个同步代码或方法时,该线程只需去对象头中去判断一下是否当前线程是否持有该偏向锁就可以了。
一旦出现其它线程竞争锁资源时,偏向锁就会被撤销。偏向锁的撤销需要等待全局安全点(JVM的stop the world),暂停持有该锁的线程,同时检查该线程是否还在执行该方法,如果是,则升级锁,反之则被其它线程抢占。
synchronized优化——轻量级锁
升级场景
当有另外一个线程竞争获取这个锁时,由于该锁已经是偏向锁,当发现对象头中的线程 ID 不是自己的线程 ID,就会进行 CAS 操作获取锁,如果获取成功,直接替换对象头中的线程 ID 为自己的 ID,该锁会保持偏向锁
状态,如果获取锁失败,代表当前锁有一定的竞争,偏向锁将升级为轻量级锁
。
升级过程
撤销偏向锁,升级轻量级锁,每个线程在自己的线程栈生成LockRecord,用CAS操作将markword设置为指向自己这个线程的LR的指针,设置成功者得到锁。轻量级锁在加锁过程中,用到了自旋锁
,自旋锁的使用,其实也是有一定条件的,如果一个线程执行同步代码块的时间很长,那么这个线程不断的循环反而会消耗 CPU 资源,满足以下两种情况之一后升级为重量级锁
- 默认情况下自旋的次数是 10 次,可以通过-XX:PreBlockSpin来修改,或者自旋线程数超过CPU核数的一半
- 在 JDK1.6 之后,引入了自适应自旋锁,自适应意味着自旋的次数不是固定不变的,而是根据前一次在同一个锁上自旋的时间以及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接阻塞线程,避免浪费处理器资源
升级优点
-
轻量级锁
适用于线程交替执行同步块的场景,绝大部分的锁在整个同步周期内都不存在长时间的竞争 -
轻量级锁也支持
自旋
,因此其他线程再次争抢时,如果CAS
失败,将不再会进入阻塞状态
,而是不断自旋。之所以自旋更好,是因为之前说了,默认线程持有锁的时间都不会太长,如果线程被挂起阻塞可能代价会更高 -
如果自旋锁重试之后抢锁依然失败,那么同步锁就会升级至
重量级锁
synchronized优化——重量级锁
在这个状态下,未抢到锁的线程都会进入 Monitor,之后会被阻塞在WaitSet集合
中,也就变成了优化之前的Synchronized锁
。
java中每个对象都关联了一个监视器锁monitor,当monitor被占用时就会处于锁定状态。线程执行monitorenter 指令时尝试获取monitor的所有权,过程如下:
- 如果monitor的进入数为 0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor 的所有者。
- 如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加 1。
- 如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为 0,再重新尝试获取monitor的所有权。
从上面过程可以看出两点,第一:monitor是可重入的,他有计数器,第二:monitor是非公平锁
synchronized优化——锁消除
锁消除是指虚拟机即时编译器(JIT)在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。锁消除的主要判定依据来源于逃逸分析的数据支持,如果判断在一段代码中,堆上的所有数据都不会逃逸出去从而被其他线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加锁自然就无须进行。
变量是否逃逸,对于虚拟机来说需要使用数据流分析来确定,但是程序员自己应该是很清楚的,怎么会在明知道不存在数据争用的情况下要求同步呢?实际上有许多同步措施并不是程序员自己加入的,同步的代码在Java程序中的普遍程度也许超过了大部分读者的想象。下面这段非常简单的代码仅仅是输出3个字符串相加的结果,无论是源码字面上还是程序语义上都没有同步。
StringBuffer的append ( ) 是一个同步方法,锁就是this也就是(new StringBuilder())。虚拟机发现它的动态作用域被限制在concatString( )方法内部。也就是说, new StringBuilder()对象的引用永远不会“逃逸”到concatString ( )方法之外,其他线程无法访问到它,因此,虽然这里有锁,但是可以被安全地消除掉,在即时编译之后,这段代码就会忽略掉所有的同步而直接执行了。
synchronized优化——锁粗化
原则上,我们在编写代码的时候,总是推荐将同步块的作用范围限制得尽量小,只在共享数据的实际作用域中才进行同步,这样是为了使得需要同步的操作数量尽可能变小,如果存在锁竞争,那等待锁的线程也能尽快拿到锁。
大部分情况下,上面的原则都是正确的,但是如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。
例如StringBuffer的append有synchronized,循环100次的话JVM可能会把这个方法的synchronized抹掉,反而是在整个for循环加上synchronized
代码使用synchronized的原则
-
减少synchronized的范围
-
降低synchronized锁的粒度:将一个锁拆分为多个锁提高并发度,例如ConcurrentHashMap
-
读写分离:读取时不加锁,写入和删除时加锁,例如:ConcurrentHashMap,CopyOnWriteArrayList和ConyOnWriteSet
多线程访问同步方法的7种情况
两个线程同时访问一个对象(即runnable接口是一个实例)的同步方法(起作用)
两个线程访问的是两个对象(即runnable接口不是一个实例)的同步方法(不起作用)
两个线程访问的是一个对象/两个对象synchronized的静态方法(起作用)
两个线程同时访问同步方法与非同步方法(非同步方法的访问不被影响)
两个线程同时访问同一个对象的不同的普通同步方法(两个方法的访问无法同时进行,因为是一把锁)
同时访问静态synchronized和非静态 synchronized方法(两个方法的访问可以同时进行,非静态锁的是this,静态锁的是class对象)
方法拋异常后,JVM会帮我们释放锁,Lock抛出异常后不会释放锁,需要显式释放
复盘:三个核心思想
- 把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应第1、5种情况)
- 每个实例都对应有自己的一把锁,不同实例之间互不影响。例外锁对象是* class以及 synchronized 修饰的是 static方法的时候,所有对象共用同一把类锁(对应第2、3、4、6种情况)
- 无论是方法正常执行完毕或者方法抛岀异常,都会释放锁(对应第7种情况)
常见面试题
synchronized与Lock的区别
- synchronized是关键字,而Lock是一个接口
- synchronized会自动释放锁,而Lock必须手动释放锁
- synchronized是不可中断的,Lock可以中断也可以不中断(等待过程)
- 通过Lock可以知道线程有没有拿到锁,而synchronized不能
- synchronized能锁住方法和代码块,而Lock只能锁住代码块
- Lock可以使用读锁提高多线程读效率
- synchronized是非公平锁,ReentrantLock可以控制是否是公平锁
多线程访问同步方法的各种具体情况
就是多线程访问同步方法的7种情况
课外知识补充
Linux系统的体系架构
Linux操作系统的体系架构分为:用户空间(应用程序的活动空间)和内核
- 内核:本质上可以理解为一种软件,控制计算机的硬件资源,并提供上层应用程序运行的环境
- 用户空间:上层应用程序活动的空间。应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等
- 系统调用:为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。
用户态与内核态转化
所有进程初始都运行于用户空间,此时即为用户运行状态(简称:用户态)。但是当它调用系统调用执行某些操作时
,例如 I/O调用,此时需要陷入内核中运行
,我们就称进程处于内核运行态
(或简称为内核态)。
系统调用的过程可以简单理解为:
- 用户态程序将一些数据值放在寄存器中,或者使用参数创建一个堆栈,以此表明需要操作系统提供的服务
- 用户态程序执行系统调用
- CPU切换到内核态,并跳到位于内存指定位置的指令
- 系统调用处理器(system call handler)会读取程序放入内存的数据参数,并执行程序请求的服务
- 系统调用完成后,操作系统会重置CPU为用户态并返回系统调用的结果
由此可见用户态切换至内核态需要传递许多变量,同时内核还需要保护好用户态在切换时的一些寄存器值、变量等,以备内核态切换回用户态。这种切换就带来了大量的系统资源消耗,这就是在synchronized未优化之前,效率低的原因。
Java对象的布局
在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充,如下图所示:
对象头
在普通实例对象中,oopDesc的定义包含两个成员,分别是_mark和_metadata
_mark
表示对象标记、属于markOop类型,也就是接下来要讲解的Mark World,它记录了对象和锁有关的信息_metadata
表示类元信息,类元信息存储的是对象指向它的类元数据(Klass)的首地址,其中Klass表示普通指针、_compressed_klass表示压缩类指针
对象头由两部分组成,一部分用于存储自身的运行时数据,称之为 Mark Word,另外一部分是类型指针,及对象指向它的类元数据的指针。
Mark Word
Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。Mark Word对应的类型是markOop,源码位于markOop.hpp中。
在64位虚拟机下,Mark Word是64bit大小的,其存储结构如下:
在32位虚拟机下,Mark Word是32bit大小的,其存储结构如下:
klass pointer
这一部分用于存储对象的类型指针,该指针指向它的类元数据,JVM通过这个指针确定对象是哪个类的实例。该指针的位长度为JVM的一个字大小,即32位的JVM为32位,64位的JVM为64位。如果应用的对象过多,使用64位的指针将浪费大量内存,统计而言,64位的JVM将会比32位的JVM多耗费50%的内存。
为了节约内存可以使用选项-XX:+UseCompressedOops开启指针压缩,其中,oop即ordinaryobject pointer普通对象指针。开启该选项后,下列指针将压缩至32位:
- 每个Class的属性指针(即静态变量)
- 每个对象的属性指针(即对象变量)
- 普通对象数组的每个元素指针
当然,也不是所有的指针都会压缩,一些特殊类型的指针JVM不会优化,比如指向PermGen的Class对象指针(JDK8中指向元空间的Class对象指针)、本地变量、堆栈元素、入参、返回值和NULL指针等。
对象头 = Mark Word + 类型指针(未开启指针压缩的情况下)
- 在32位系统中,Mark Word = 4 bytes,类型指针 = 4bytes,对象头 = 8 bytes = 64 bits
- 在64位系统中,Mark Word = 8 bytes,类型指针 = 8bytes,对象头 = 16 bytes = 128bits
实例数据
就是类中定义的成员变量。
对齐填充
对齐填充并不是必然存在的,也没有什么特别的意义,他仅仅起着占位符的作用,由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍
换句话说,就是对象的大小必须是8字节的整数倍。而对象头正好是8字节的倍数,因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全
一些思考题
多个线程等待同一个synchronized锁的时候,JVM如何选择下个获取锁的是哪个线程?目前是不公平的状态,和JVM有关
Synchronized使得同时只有一个线程可以执行,性能较差,有什么办法可以提升性能?优化使用范围使用其他类型Lock
我想更灵活地控制锁的获取和释放(现在释放锁的时机都被规定死了),怎么办?可以自己实现一个锁
什么是锁的升级、降级?什么是JVM里的偏向锁、轻量级锁、重量级锁?以前的synchronized锁性能不高,后来出了偏向锁、轻量级锁、重量级锁等东西提高了它的性能,JVM会根据使用的种种指标来对锁进行优化,还涉及对象头的一些字段
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Android BitmapFactory的基本使用
问题描述 使用方法BitmapFactory.decodeFile转化Bitmap时报错:java.lang.RuntimeException: Canvas: trying to draw too large(120422400bytes) bitmap. 解决方案 frameworks/base/graphics/java/android/graphics/RecordingCanvas.javapublic static final int…...
2024/4/21 18:18:06 - 操作系统之——加锁和信号量的区别
锁(lock)和信号量(semaphore)的区别 在上操作系统课的时候,一直没弄懂加锁互斥,以及用信号量来进行临界区的互斥有啥异同。 最近在书上看到一段话,我终于弄懂了!!! 对一段代码加锁相当于我每次…...
2024/4/20 13:31:44 - Qt MetaObject System详解之五:signalslot
本篇探析signal slot的连接和调用是如何实现的。 宏SLOT,SIGNAL 在qobjectdefs.h中有这样的定义: # define METHOD(a) "0"#a # define SLOT(a) "1"#a # define SIGNAL(a) "2"#a 不过是在方法签名之前加了一个…...
2024/4/20 13:31:43 - OpenFeign 学习笔记
目录介绍:基本使用pom:yaml:主启动类;接口类:controller类:补充加强日志:首先配置一个类级别说明:然后 再配置yaml :介绍: 与Ribbon 一样负责进行 服务调用的 不过有区别…...
2024/4/20 13:31:42 - vs命令工具导出dll函数
1、找到这个工具 2、函数直接在窗口中查看,输入命令 命令:dumpbin/exports DLL路径:C:\Users\user\Desktop\test\test.dll 即:dumpbin/exports C:\Users\user\Desktop\test\test.dll 3、函数保存在文件中查看,输入命…...
2024/4/20 13:31:41 - 什么是老域名?选择老域名要注意什么?
老域名,其实就是已经存在很久的“域名地址”。正常情况下,注册时间达到一定年份,可以称为老域名。 但是,我们普遍认为可能有SEO价值的老域名,必须是使用过,在互联网上有踪迹的或者说在搜索引擎上具有信任度…...
2024/4/21 18:18:05 - promise常用的api
promise.all():传递多个参数,成功之后,接受value 为数组,一旦有一个promise对象失败,会调用失败原因,不会返回其他函数执行结果 promise.reject() :直接调用失败函数 promise.resolve() 直接调用成功函数 promise.r…...
2024/4/28 0:18:12 - HTML5+CSS3 制作简单图文广告
超链接列表的简单运用 1.今日份的h5课堂作业 效果图片: 代码如下: <!doctype html> <html> <head><meta charset"UTF-8"><title>家居网</title> </head> <style>*{margin: 0;}#box1{heig…...
2024/4/27 0:03:08 - Task03 制作一个奶茶点餐页面
Task03 制作一个奶茶点餐页面一、结果二、注意事项三、直接上码一、结果 二、注意事项 表单页面与提交页面分别使用section标签包装。form标签包装整个表单,其中action属性定义了在提交表单时,应该把所收集的数据送给谁(/那个模块)(URL)去处理。.method定义发送数据…...
2024/4/21 18:18:02 - 数组里面遍历,再判断字符串中是否包含
// 1行の各データが結合されたデータ String oneLineRowData getOneLineRowData(row); // 行にキーワードが含まれてるかチェック。(AND検索なので含まれない時点でfalseとする) for (var keyword in keywordList) { if (!oneLineRowData.toLowerCase()…...
2024/4/21 18:18:01 - Qt入门-文本框类QLineEdit和QTextEdit
http://blog.csdn.net/xgbing/article/details/7766476...
2024/4/27 22:38:34 - 简单分析STM32和51的区别
分享本文,简单分析STM32与51单片机的区别与取舍之处。 单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串…...
2024/4/21 16:44:34 - 多标签问题训练方法
利用标签之间的相关性 主要思路 celosssoftmax代替bceloss 由于问题特殊,暂不考虑图卷积等方式。 主要参考 circle loss https://zhuanlan.zhihu.com/p/138117543 concurrent softmax https://zhuanlan.zhihu.com/p/143247212 训练的时候修改softmax。 显式标签&am…...
2024/4/21 18:17:58 - Day2 绘制UML
孤尽T31训练营作业需要用到UML图,汇总一下相关的知识 UML模型图的构成 事物(Things):UML模型中最基本的构成元素,是具有代表性的成分的抽象 关系(Relationships):关系把事物紧密联系在一起 图(Diagrams ):图是事物和…...
2024/4/20 13:31:56 - 链栈链队列c语言写法
node_stack—string版本 #include <iostream> using namespace std;struct node {int data;node *prior; };class stack_node { public:node *base;node *top;stack_node(){basetopnew node;top->priorNULL;}bool empty(){if(basetop)return true;elsereturn false;}…...
2024/4/20 13:31:55 - Docker 安装 MSSQL 2017
前言 微软数据库开源安装,可以在linux环境进行安装,笔者也跟着进行感受了一下在linux docker环境安装MSSQL 2017 。安装过程如下 1 安装docker 环境(此处不在讲述) 2 在docker 拉取mssql 2017 镜像文件 3 安装并启动镜像服务 4 连接访问 笔者系统环…...
2024/4/20 13:31:54 - LeetCode606.根据二叉树创建字符串
题目描述 你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。 空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。 来源:力扣(LeetCode࿰…...
2024/4/20 13:31:53 - C++实验二之继承和多态
文章目录一、继承访问权限测试1.1 设计类A具有public, protected, private等不同属性的成员函数或变量;1.2 类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;1.3 在类B中添加public, protecte…...
2024/4/20 13:31:53 - 48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记
Java基础这个东西,无论在哪个公司都被看得尤为重要,而面试中关于基础的问题也是层出不穷。所以基础可以说是重中之重,当你的基础打牢了,其他的也就没有那么重要了。 说到基础,无外乎操作系统,网络…...
2024/4/20 13:31:51 - Qt MetaObject sysmtem 详解之三:QMetaObject接口实现
本篇从Qt MetaObject源代码解读相关接口的实现,这些接口都定义于qmetaobject.cpp中。 QMetaObject::className() inline const char *QMetaObject::className() const { return d.stringdata; } 从前一篇可知,d.stringdata就是那块字符串数据…...
2024/4/20 6:57:08
最新文章
- QT——简易计算器(从0开始)
目录 一、题目描述: 二、创建工程: 1. 编辑 2. 3. 4. 默认 5. 6. 7. 8. 默认 9. 创建完成 三、UI界面设计: 1. 添加按钮 1. 2. 按钮界面 3. 按钮绑定快捷键 2. 文本框添加 1. 文本框字体 2. 默认文本 3. 文本对齐方式…...
2024/4/28 0:41:02 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 基于FPGA轻松玩转AI
启动人工智能应用从来没有像现在这样容易!受益于像Xilinx Zynq UltraScale MPSoC 这样的FPGA,AI现在也可以离线使用或在边缘部署、使用.可用于开发和部署用于实时推理的机器学习应用,因此将AI集成到应用中变得轻而易举。图像检测或分类、模式…...
2024/4/22 12:54:11 - 【Locust分布式压力测试】
Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...
2024/4/26 22:21:09 - PHP+python高校教务处工作管理系统q535p
开发语言:php 后端框架:Thinkphp/Laravel 前端框架:vue.js 服务器:apache 数据库:mysql 运行环境:phpstudy/wamp/xammp等 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方…...
2024/4/26 8:31:01 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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