理解Java并发编程:ReentrantLock和ReentrantReadWriteLock
文章目录
- Lock锁
- Lock锁的方法
- lock
- lockInterruptibly
- tryLock
- tryLock(long time, TimeUnit unit)
- unlock
- newCondition
- Lock锁的优势
- Lock锁的使用案例
- ReentrantLock
- ReentrantReadWriteLock
- Lock与Synchronized的比较
- Lock锁的原理
Lock锁
Lock是自JDK1.5起在Java并发包(JUC)中提供的锁。与synchronized相比,Lock提供了更加灵活的、可扩展的锁相关操作。支持多个与锁相关的条件。
锁本质上是用于控制多个线程对共享资源访问的工具。 通常,锁提供对共享资源的独占访问,一次只有一个线程可以获取锁,所有对共享资源的访问都需要先获取锁。 但是,某场景下可能允许并发访问共享资源,例如对某个共享资源的读操作,这就要求锁具备这个功能。Lock接口的一个具体实现:ReadWriteLock就可以实现多个线程同时读。这种特性是synchronized不具备的。
synchronized方法或代码块隐式提供了对每个对象关联的监视器锁(monitor)的访问,所有锁的获取和释放必须在一个代码块结构中。即当获取多个锁时,它们必须以相反的顺序释放,并且所有锁必须在它们被获取的同一个代码范围内释放。
虽然synchronized方法和代码块的作用域机制使得我们实现并发编程更加容易,避免了许多涉及锁的常见编程错误。但在某些情况下,我们需要以更灵活的方式使用锁。 比如我们需要先获取A锁,然后获取B锁,接着释放A锁获取C锁,然后释放B锁获取D锁。像这种复杂的场景,synchronized无能为力。而Lock接口的实现允许在不同范围内获取和释放锁,并允许以任何顺序获取和释放多个锁。
这种灵活性也要求我们必须控制好锁的获取和释放。不像synchronized那样,锁的获取和释放是由底层自动实现的,编程中只要使用关键字就行了。
因此在通常情况下,我们应该是遵循下列使用Lock的习惯:
Lock lock = ...;lock.lock();try {// access the resource protected by this lock} finally {lock.unlock();}
当锁定和解锁发生在不同的作用域时,必须确保持有锁时执行的所有代码都受到 try-finally 或 try-catch 的保护,以保证在必要时释放锁。
Lock的实现提供了多种形式的锁。
1)非阻塞方式获取锁:tryLock();
2)可中断的方式获取锁:lockInterruptibly();
3)获取锁时还可以加入超时时间:tryLock(long, TimeUnit);
Lock实例只是普通对象,它们本身也可以用作synchronized语句中的目标对象。 获取Lock实例的监视器锁(monitor)与调用该实例的任何lock方法没有特定的关系。 建议不要在synchronized方法或者代码块中使用Lock实例作为锁定的对象,以避免混淆。
Lock锁的方法
public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;void unlock();Condition newCondition();
}
lock
以阻塞的方式获取锁,如果获取锁失败,则该线程进入休眠状态,线程调度被暂停,直到获得锁。
lockInterruptibly
与lock方法相比,该方法可以响应中断。
如果获取锁成功则立即返回。否则线程进入休眠状态,暂停被线程调度,直到下列情况发生:
1)获取到锁
2)其它线程中断了该线程,并且支持锁获取中断
如果当前线程在获取锁时被中断(并且支持中断获取锁)则该方法会抛出一个InterruptedException。
tryLock
以非阻塞方式获取锁,如果锁可用则返回true;如果不可用则立即返回false,而不是阻塞线程。
一贯用法如下:
Lock lock = ...;if (lock.tryLock()) {try {// 业务逻辑A} finally {lock.unlock();}} else {// 业务逻辑B}
tryLock(long time, TimeUnit unit)
和tryLock方法相比,多了支持设置等待时间和中断响应。
如果锁可用,则此方法立即返回true。 如果锁不可用,则当前线程将出于线程调度目的而被禁用并处于休眠状态,直到以下三种情况之一发生:
1)锁被当前线程获取到
2)其他一些线程中断当前线程,并且支持中断获取锁
3)经过了指定的等待时间
如果当前线程在获取锁时被中断(支持中断获取锁的前提下),则该方法会抛出一个InterruptedException。
unlock
有加锁,必然有释放锁。unlock方法就是用于释放锁。
newCondition
Lock锁提供了一个与之相关的条件对象(Condition)。该方法就是返回绑定到此Lock实例的新Condition实例。
在等待Condition条件之前,当前线程必须先持有与Condition相关联的锁。 调用Condition.await()方法将在等待之前自动释放锁,并在等待返回之前重新获取锁。
后面会介绍具体的案例。
Lock锁的优势
当一个线程调用了synchronized方法之后,如果没有成功获取到锁,就立即陷入了等待,没有第二种选择。而Lock锁可以选择不同的方式,可以立即陷入等待,也可以立即返回,也可以等待一段时间。具体看你调用哪个API方法。
Lock锁的使用案例
Lock是一个接口,其有多种实现类,常用的有ReentrantLock、ReentrantReadWriteLock等,我们一一举例。
ReentrantLock
ReentrantLock是Lock接口最常用的实现类,它一个可重入的锁,可以认为和synchronized具有相同的语义,但更具扩展性。
ReentrantLock锁会被最近一次成功获取到锁的但还未释放锁的线程拥有。ReentrantLock的lock方法会在成功获取到锁时返回,如果检测到当前线程已经拥有了该锁,则该方法立即返回。
ReentrantLock的构造函数接受一个可选的公平参数。当设置为为true,即公平锁时,锁倾向于授予等待时间最长的线程。反之,不能保证任何特定的锁的获取顺序,即非公平。
注意,在高并发场景下,多个线程访问的公平锁的程序可能会显示出较低的总体吞吐量(即更慢,通常慢得多)。并且在公平性方面(保证不出现饿死的情况)和非公平锁的差异也很小。
另外,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的众多线程之一可能会连续多次获得它,而其他活动线程一直没能够持有该锁。特别要强调的是,使用没有设置等待时间的tryLock()方法是不遵守公平性设置的。
ReentrantLock典型的使用模式如下:
class X {private final ReentrantLock lock = new ReentrantLock();// ...public void method() {lock.lock(); // block until condition holdstry {// ... method body} finally {lock.unlock()}}}
举例1:快速入门
下面的例子中,方法method1中会对成员变量count自增,而自增操作不是一个原子操作,有读数据、加法操作、写数据多个步骤。因此需要加锁保证多线程环境下的并发安全。
加锁时,能保证输出的结果是正确的累计值;而不加锁时,输出的最终结果可能小于预期。可以对比下加锁和不加锁的运行结果。
public class TestLock {private ReentrantLock lock = new ReentrantLock();private int count = 0;public void method1() {//lock.lock();//注释这行代码取消加锁try {Thread.sleep(1000);System.out.println(++count);} catch (InterruptedException e) {e.printStackTrace();} finally {//lock.unlock();}}public static void main(String[] args) {TestLock testLock = new TestLock();//创建多个线程对共享变量同时进行操作for (int i = 0; i < 20000; i++) {new Thread(new Runnable() {@Overridepublic void run() {testLock.method1();}}).start();}}
}
举例2:基本使用
public class Test1 {private Lock lock = new ReentrantLock();public void method1() {try {lock.lock();System.out.println("method1 business");} finally {lock.unlock();}}public void method2() {try {lock.lock();System.out.println("method2 business");} finally {lock.unlock();}}public static void main(String[] args) {Test1 test = new Test1();Thread thread1 = new Thread(() -> {for (int i = 0; i < 10; i++) {test.method1();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 10; i++) {test.method2();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});thread1.start();thread2.start();}
}
上述案例展示了多个方法共享一把锁的场景,运行程序,我们可以看到程序正常输出20次,两个线程交替执行完成。
如果我们忘记了释放锁,此时会发生什么情况呢?比如注释掉第一个方法的释放锁操作。
public void method1() {try {lock.lock();System.out.println("method1 business");} finally {//lock.unlock();}}
此时只输出了10次method1 business
,并且程序没有终止。因为method1 先被调用,并且一直持有锁没有释放,导致method2获取锁失败,一直等待 。然而method1 可以不断重新获取锁(可重入的),因此第一个线程循环调用method1方法后输出。
上述使用Lock的方式和synchronized类似,都是一直等待,直到获得锁。
在实际开发中要遵循try{...}finally{...}
这种使用Lock锁的范式,防止锁得不到释放。
上述代码method2方法改进为使用tryLock
,则可以避免程序阻塞,虽然获取锁失败,但是程序最终能执行完成,示例如下。
public void method2() {
// try {
// lock.lock();
// System.out.println("method2 business");
// } finally {
// lock.unlock();
// }boolean success = false;try {success = lock.tryLock(1000, TimeUnit.MILLISECONDS);} catch (InterruptedException e) {e.printStackTrace();}if (success) {System.out.println("lock success");} else {System.out.println("lock fail");}}
举例3:可重入性
下列例子中,虽然get方法中也要获取锁,但是并不会导致死锁,因为ReentrantLock 支持重入。
public class Test02 extends Thread {private ReentrantLock lock = new ReentrantLock();public void get() {lock.lock();try {System.out.println("get方法" + Thread.currentThread().getName());} finally {lock.unlock();}}public void set() {lock.lock();try {System.out.println("set方法" + Thread.currentThread().getName());get();//虽然get方法中也要获取锁,但是不会死锁,因为ReentrantReadWriteLock 支持重入} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}@Overridepublic void run() {set();}public static void main(String[] args) {for (int i = 0; i < 4; i++) {Test02 ss = new Test02();ss.start();}}
}//输出
set方法Thread-0
get方法Thread-0
set方法Thread-1
set方法Thread-2
get方法Thread-1
get方法Thread-2
set方法Thread-3
get方法Thread-3
公平锁、非公平锁
如果在绝对时间上,先对锁进行获取的请求一定会先被满足,那么这个锁是公平的,反之,是不公平的。公平的获取锁,也就是等待时间最长的线程最优先获取锁,也可以说锁获取是顺序的。
ReentrantLock类提供了一个构造函数,通过传入fair参数控制锁是否是公平的。
1)公平锁
公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。公平锁每次都是依次从队首取值。
2)非公平锁
在等待锁的过程中, 如果有任意新的线程妄图获取锁,都是有很大的几率直接争抢到锁的。
公平锁是先到先得,按序进行。非公平锁就是不排队直接拿,失败再说。公平锁保证了锁的获取按照FIFO原则,而代价是进行大量的线程切换。非公平性锁虽然可能造成线程“饥饿”,但由于先尝试争抢,失败后才阻塞,因此最大限度减少线程切换,具有更大的吞吐量。
ReentrantReadWriteLock
前面提到锁(如ReentrantLock、synchronized)都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问。在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。
假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,那么应该允许多个线程能同时读取共享资源。但是如果有一个线程去写这些共享资源,就不应该再有其它线程对该资源进行读或写(也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。
JDK5引入的ReentrantReadWriteLock 就可以来实现读写锁。
案例1:快速入门
分别使用读锁和写锁,从运行效果可以发现读锁是可以共享的,而写锁是独占的;
因此读锁可以近乎同时完成操作,而写锁是排他的,需要等待前一个线程操作完成并释放掉锁,下一个线程才能进行操作。
public class ReadWriteLockTest {private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();public void method1() {//readWriteLock.readLock().lock();readWriteLock.writeLock().lock();try {Thread.sleep(1000);System.out.println("method1 business");} catch (Exception e) {e.printStackTrace();} finally {//readWriteLock.readLock().unlock();readWriteLock.writeLock().unlock();}}public static void main(String[] args) {ReadWriteLockTest readWriteLockTest = new ReadWriteLockTest();IntStream.range(0, 10).forEach(i -> new Thread(readWriteLockTest::method1).start());}
}
案例2:自定义缓存
我们以一个自定义缓存的例子来演示读写锁的使用。
public class Cache {static Map<String, Object> map = new HashMap<String, Object>();static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();static Lock r = rwl.readLock();static Lock w = rwl.writeLock();// 获取一个key对应的valuepublic static final Object get(String key) {r.lock();try {//为了演示出效果,get操作再细分如下,开始—>结束视为原子步骤System.out.println("正在做读的操作,key:" + key + " 开始");Thread.sleep(100);Object object = map.get(key);System.out.println("正在做读的操作,key:" + key + ",value:" + object + " 结束");System.out.println();return object;} catch (InterruptedException e) {e.printStackTrace();} finally {r.unlock();}return key;}// 设置key对应的value,并返回旧有的valuepublic static final Object put(String key, Object value) {w.lock();try {//为了演示效果,set操作再细分如下,开始—>结束整个过程视为原子步骤System.out.println("正在做写的操作,key:" + key + ",value:" + value + "开始.");Thread.sleep(100);Object object = map.put(key, value);System.out.println("正在做写的操作,key:" + key + ",value:" + value + "结束.");System.out.println();return object;} catch (InterruptedException e) {e.printStackTrace();} finally {w.unlock();}return value;}// 清空所有的内容public static final void clear() {w.lock();try {map.clear();} finally {w.unlock();}}public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {Cache.put(i + "", i + "");}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {Cache.get(i + "");}}}).start();}
}//输出
正在做读的操作,key:0 开始
正在做读的操作,key:0,value:null 结束正在做写的操作,key:0,value:0开始.
正在做写的操作,key:0,value:0结束.正在做读的操作,key:1 开始
正在做读的操作,key:1,value:null 结束正在做写的操作,key:1,value:1开始.
正在做写的操作,key:1,value:1结束.正在做读的操作,key:2 开始
正在做读的操作,key:2,value:null 结束正在做写的操作,key:2,value:2开始.
正在做写的操作,key:2,value:2结束.正在做读的操作,key:3 开始
正在做读的操作,key:3,value:null 结束正在做写的操作,key:3,value:3开始.
正在做写的操作,key:3,value:3结束.正在做写的操作,key:4,value:4开始.
正在做写的操作,key:4,value:4结束.正在做读的操作,key:4 开始
正在做读的操作,key:4,value:4 结束正在做写的操作,key:5,value:5开始.
正在做写的操作,key:5,value:5结束.正在做读的操作,key:5 开始
正在做读的操作,key:5,value:5 结束正在做写的操作,key:6,value:6开始.
正在做写的操作,key:6,value:6结束.正在做读的操作,key:6 开始
正在做读的操作,key:6,value:6 结束正在做写的操作,key:7,value:7开始.
正在做写的操作,key:7,value:7结束.正在做读的操作,key:7 开始
正在做读的操作,key:7,value:7 结束正在做写的操作,key:8,value:8开始.
正在做写的操作,key:8,value:8结束.正在做读的操作,key:8 开始
正在做读的操作,key:8,value:8 结束正在做写的操作,key:9,value:9开始.
正在做写的操作,key:9,value:9结束.正在做读的操作,key:9 开始
正在做读的操作,key:9,value:9 结束
一般而言,读写锁的性能都会比排它锁好,因为大多数场景读是多于写的。在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。
上述案例中,Cache使用了一个非线程安全的HashMap作为缓存的存储结构,同时使用读写锁的读锁和写锁来保证Cache是线程安全的。在读操作get(String key)方法中,需要获取读锁,这使得并发访问该方法时不会被阻塞。写操作put(String key,Object value)方法和clear()方法,在更新HashMap时必须提前获取写锁,当获取写锁后,其他线程对于读锁和写锁的获取均被阻塞,而只有写锁被释放之后,其他读写操作才能继续。Cache使用读写锁提升读操作的并发性,也保证每次写操作对所有的读写操作的可见性。
Lock与Synchronized的比较
可以从4个方面来对比基于Java API的Lock锁和基于Java关键字Synchronized的同步锁
1)锁的获取:Lock是JDK提供的API,通过编程的方式手动获取锁。而synchronized是Java关键字,底层通过JVM自动获取锁。
2)锁的实现:Lock锁是JDK自带的,是以Java代码方式实现的。而synchronized底层是通过JVM 调用操作系统的系统函数实现的。
3)锁的释放:Lock锁需要通过unlock手动释放,而synchronized是JVM自动释放的。
4)锁的类型:Lock锁提供了灵活多样的锁,比如公平锁、非公平锁、读写锁、可重入锁;而synchronized只支持可重入。
使用上面缓存代码的案例,来比较一下两者的性能。
基于Lock
public class Cache1 {static Map<String, Object> map = new HashMap<>();static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();static Lock r = rwl.readLock();static Lock w = rwl.writeLock();// 获取一个key对应的valuepublic static final Object get(String key) {r.lock();try {//为了演示出效果,get操作再细分如下,开始—>结束视为原子步骤System.out.println("正在做读的操作,key:" + key + " 开始");Thread.sleep(10);Object object = map.get(key);System.out.println("正在做读的操作,key:" + key + ",value:" + object + " 结束");System.out.println();return object;} catch (InterruptedException e) {e.printStackTrace();} finally {r.unlock();}return key;}// 设置key对应的value,并返回旧有的valuepublic static final Object put(String key, Object value) {w.lock();try {//为了演示效果,set操作再细分如下,开始—>结束整个过程视为原子步骤System.out.println("正在做写的操作,key:" + key + ",value:" + value + "开始.");Thread.sleep(10);Object object = map.put(key, value);System.out.println("正在做写的操作,key:" + key + ",value:" + value + "结束.");System.out.println();return object;} catch (InterruptedException e) {e.printStackTrace();} finally {w.unlock();}return value;}// 清空所有的内容public static final void clear() {w.lock();try {map.clear();} finally {w.unlock();}}public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();Thread t1 = new Thread(() -> {for (int i = 0; i < 3000; i++) {Cache1.put(i + "", i + "");}});Thread t2 = new Thread(() -> {for (int i = 0; i < 3000; i++) {Cache1.get(i + "");}});t1.start();t2.start();System.out.println("waiting...");t1.join();t2.join();long end = System.currentTimeMillis();System.out.println("Lock cost:" + (end - start));}
}
基于synchronized
public class Cache2 {static Map<String, Object> map = new HashMap<>();// 获取一个key对应的valuepublic static synchronized final Object get(String key) throws InterruptedException {//为了演示出效果,get操作再细分如下,开始—>结束视为原子步骤System.out.println("正在做读的操作,key:" + key + " 开始");Thread.sleep(10);Object object = map.get(key);System.out.println("正在做读的操作,key:" + key + ",value:" + object + " 结束");System.out.println();return object;}// 设置key对应的value,并返回旧有的valuepublic static synchronized final Object put(String key, Object value) throws InterruptedException {//为了演示效果,set操作再细分如下,开始—>结束整个过程视为原子步骤System.out.println("正在做写的操作,key:" + key + ",value:" + value + "开始.");Thread.sleep(10);Object object = map.put(key, value);System.out.println("正在做写的操作,key:" + key + ",value:" + value + "结束.");System.out.println();return object;}// 清空所有的内容public static synchronized final void clear() {map.clear();}public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();Thread t1 = new Thread(() -> {for (int i = 0; i < 3000; i++) {try {Cache2.put(i + "", i + "");} catch (InterruptedException e) {e.printStackTrace();}}});Thread t2 = new Thread(() -> {for (int i = 0; i < 3000; i++) {try {Cache2.get(i + "");} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();t2.start();System.out.println("waiting...");t1.join();t2.join();long end = System.currentTimeMillis();System.out.println("synchronized cost:" + (end - start));}
}
对比发现两者没有太明显的差异,从侧面印证了JDK1.6之后synchronized的性能提升。
Lock锁的原理
Lock锁的底层基于AQS实现,下面简单阐述一下Lock锁的实现步骤。后面会对AQS作详细介绍。
ReentrantLock
1)当调用了ReentrantLock的lock方法时,当前线程尝试获取对象的锁,如果已经有其它线程持有了该锁,则获取失败,该线程进入到AQS的阻塞队列中
2)如果获取到锁,那么根据是否是公平锁进行不同的处理
2.1) 公平锁,则当前线程会直接放置到AQS阻塞队列的末尾
2.2) 非公平锁,则当前线程会先进行CAS操作,如果成功则直接争抢到锁;如果失败则与公平锁的处理方式一致,当前线程被放置到阻塞队列的末尾
3)当调用了ReentrantLock的unlock方法时,底层会调用AQS的release方法对AQS的state成员变量进行减一操作,如果减一后state值不为0,那么release操作执行完毕;如果state值为0,则调用LockSupport的unpark方法(底层是操作系统的pthread_mutex_unlock)唤醒该线程对象后面的等待队列中的第一个后继线程,使其能够获得对象的锁。之所以减一后state值不为0,是因为ReentrantLock是可重入的,同一个线程可能多次调用过lock方法,每调一次,state值加一
在ReentrantLock中,上锁的本质就是对AQS中的state成员变量的操作:+1表示上锁,-1表示释放锁。
ReentrantReadWriteLock
读锁:
1)在获取读锁时,会先判断当前对象是否已经被加了写锁,如果已经拥有写锁,则直接失败
2)如果没有写锁,就表示当前对象没有排它锁,则当前线程会尝试给对象加锁
3)如果当前线程已经拥有了该对象的锁,那么直接将对象的读锁数量加一
写锁:
1)在获取写锁时,会先判断当前对象是否已经拥有了锁(读锁和写锁)。如果已经拥有了锁且持有锁的线程不是当前线程,则失败
2)如果当前对象没有被加锁,则为当前对象加上写锁,并且写锁的个数加一
3)将当前对象的排它锁线程持有者设置为自身
Tip:关于Java中各种锁的讲解与使用案例也可以参见:《Java中的锁》
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 第二天(数据类型转换、运算符及其优先级、位运算)
第二天 文章目录 第二天1. 基本数据类型转换1.1 自动转换1.2 强制转换1.3 隐藏的强制转换1.4 预编译2. 运算符2.1 “+”的多种用法2.3 &&和&区别,||和|的区别2.4 原码,反码,补码2.5 位运算符2.6 三目运算符1. 基本数据类型转换 Java中7中数值类型之间可以相互转…...
2024/4/15 5:56:45 - 发现一个windows11的bug
话不多说,直接上图 自从上次听从了系统的推送,手贱更新了windows11,最近爆出了各种各样的bug,最近忙着做实验具体的也没注意记录,但是晚上突然又发现了下面这个 希望 Microsoft 赶快解决吧 毕竟我也没那能力 哈哈哈哈哈...
2024/4/15 5:56:50 - 嵌入式系统(四):RISC-V处理器3
RISC-V 汇编语言 函数调用规范 调用过程分为六个阶段: 将参数存储到函数能够访问到的位置跳转到函数开始位置(使用RV32I的jal指令)获取函数需要的局部存储资源,按需保存寄存器执行函数中的指令将返回值存储到调用者能够访问到的…...
2024/4/24 9:29:02 - 一个类实现列表 同时也是迭代器
一个类实现列表 同时也是迭代器(练习) class MyList:def __init__(self):self.container []# 定义一个变量 从0开始 用来获取列表数据self.current_index 0def add(self, item):self.container.append(item)def __iter__(self):return selfdef __next…...
2024/4/20 11:45:10 - C++类的继承和多态
目录一 继承访问权限测试1 代码实现2 小结二 友元类继承测试1 代码实现2 小结三 多态性综合运用1 代码实现1 main.cpp2.CShape.h3.CShape.cpp2 运行结果3 小结一 继承访问权限测试 1 代码实现 #ifndef CSHAPE_H #define CSHAPE_H class A { public:int _a; protected:int _b;…...
2024/4/18 9:40:54 - [笔记]粒子特效6:shape属性
shape属性 使用版本2018.3.9 ●Shape:形状,在这里选择发射器的形状 ●Angle:发射的角度大小 ●Radius:发射器的大小 每种形状的属性都有差别,这里可以自己调试来了解...
2024/4/18 2:43:08 - 模仿两个人在使用eclipse svn开发
模仿两个人在使用eclipse svn开发 马克- to-win:马克 java社区:防盗版实名手机尾号: 73203 马克-to-win:现在我们模仿两个人在使用eclipse svn开发 1)先是工程师wanzi修改HelloWorld.java【1)添加一行且删除…...
2024/4/20 8:38:39 - BUUCTF - web - Easy Calc
文章目录Easy Calc知识点构造payloadEasy Calc 拿到一个计算器,看不出端倪,查看源码 有一段注释说这题有WAF,那思路应该就清晰了,绕WAF JS里面写道有Calc.php文件,可以查看一下 可以看到绕过了很多符号和字母 知…...
2024/4/15 5:57:31 - 拼多多1面:Spring MVC的主要组件有哪些?
前言 SpringMVC已经成为目前最主流的MVC框架之一,并且随着Spring3.0的发布,全面超越Struts2,成为最优秀的MVC框架。它通过一套注解,让简单的Java类成为处理请求的控制器(web层---Servlet),而无…...
2024/4/20 19:29:25 - 3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
答案:肯定不对的 hashcode()方法返回是一个整数,而equals(Object obj)方法用来判断两个对象是否相同; 在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。 如果equals(Objec…...
2024/4/20 3:30:09 - mysql8.0后一些语句变化(一)
1.grant授权 grant select,insert,delete,update on test_db.* to tom%; 2.查看隔离级别 select transaction_isolation;...
2024/4/15 12:11:42 - 树莓派系统镜像备份及压缩至最小的方法
前言:玩树莓派瞎折腾难免有一天弄坏了系统,搞坏了文件,如果不想让过去的大把配置和努力付之一炬的话,备份系统就是不二选择,本文将介绍一种树莓派系统镜像备份及压缩至最小的方法,如有错误还请指出…...
2024/4/26 13:11:59 - python正则表达式
import reprmr_\w string MR_SHOP string1"我mr_shop" print(re.match(p,string,re.I)) print(re.match(p,string1,re.I)) #不分大小写匹配 string2MR_SHOP mr_shop mre.match(p,string2,re.I) print(m.start()) print(m.end()) print(m.span()) print(m.string) p…...
2024/4/19 16:39:05 - 【加解密篇】Passware Encryption Analyzer快速检测加密文件软件
【加解密篇】Passware Encryption Analyzer快速检测加密文件软件 密码加密分析仪是一种免费工具,可扫描系统以检测受保护或加密的文件、存档和其他加密类型的文件—【suy】 文章目录【加解密篇】Passware Encryption Analyzer快速检测加密文件软件(一…...
2024/4/19 16:05:31 - Swin-Transformer网络结构详解
文章目录0 前言1 网络整体框架2 Patch Merging详解3 W-MSA详解Ω(MSA)\Omega (MSA)Ω(MSA)模块计算量Ω(W−MSA)\Omega (W-MSA)Ω(W−MSA)模块计算量4 SW-MSA详解5 Relative Position Bias详解6 模型详细配置参数0 前言 Swin Transformer是2021年微软研究院发表在ICCV上的一篇…...
2024/4/20 14:27:53 - 理解Java并发编程:synchronized锁优化(偏向锁,自旋锁,重量级锁)
文章目录再谈synchronized偏向锁轻量级锁自旋锁重量级锁几种锁的比较锁的消除与锁的粗化死锁再谈synchronized 上一节我们从底层实现原理上分析了synchronized的性能,得出一个初步结论:synchronized底层涉及到系统调用,进而引发用户态、内核…...
2024/4/21 7:06:52 - C语言 二分化查找 折半查找
贴一张简单明了的代码 #include<stdio.h> int main(){int arr[]{1,2,3,4,5,6,7,8,9,10};int k7;//要查找的数。int szsizeof(arr)/sizeof(arr[0]);int left0;//左标int rightsz-1;//右标while(left<right){int mid (leftright)/2;if(arr[mid]>k){rightmid-1;}else…...
2024/4/26 13:13:22 - LeedCode 76. Minimum Window Substring 最小覆盖子串
一、题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数…...
2024/4/20 18:33:43 - python捕获异常
捕获异常 print(-----test--1---) try:print("hehe")f open(123.txt, r) # FileNotFoundError: [Errno 2] No such file or directory: 123.txtprint("hhaha") except Exception as e:print(e) # [Errno 2] No such file or directory: 123.txtprint(&…...
2024/4/15 5:57:46 - Python Selenium.WebDriver “Edge”浏览器下的使用心得
问题背景描述 最近跑一个爬虫作业的时候用到了selenium,用的模板是Chrome浏览器的,而我自己用的是Edge,所以在一些代码上需要进行改动,否则会报错,比如Edge浏览器启动项。这里记录一下,也给有同样需要的人…...
2024/4/15 5:57:26
最新文章
- 架构师系列-消息中间件(11)- RocketMQ 进阶(5)-深入分析(2)
3. 文件刷盘机制 RocketMQ 的消息是存储在磁盘上的,这样做有两个优点: 保证断电后恢复 让存储的消息量超出内存的限制 RocketMQ 存储与读写是基于 JDK NIO 的内存映射机制,具体使用 MappedByteBuffer(基于 MappedByteBuffer 操…...
2024/4/26 13:32:49 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - react--常见hook
useState: 用于在函数组件中添加状态。示例: import React, { useState } from react;function Counter() {const [count, setCount] useState(0);return (<div><p>Count: {count}</p><button onClick{() > setCount(count 1)}>Incr…...
2024/4/24 18:34:16 - 链表面试题
删除链表中等于给定值 val 的所有节点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ …...
2024/4/21 17:51:49 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/25 11:51:20 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/25 18:39:24 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/25 18:38:39 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/25 18:39:23 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/25 18:39:22 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/25 18:39:22 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/25 18:39:20 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/25 16:48:44 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/25 13:39:44 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/25 0:00:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/25 4:19:21 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/25 18:39:12 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/25 13:19:01 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/25 18:38:58 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/25 18:38:57 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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