Java高并发之锁总结、常见的面试问题

2023-11-09

1. 锁的分类
① 乐观锁与悲观锁
  • 悲观锁:
  1. 对共享数据进行访问时,悲观锁总是认为一定会有其他线程修改数据。如果不加锁,肯定会出问题。
  2. 因此,悲观锁无论是否出现共享数据的争用,在访问数据时都会先加锁。
  • Java中同步互斥都是采用这种悲观的并发策略synchronized关键字Lock接口的实现类都是悲观锁。
  • 乐观锁:
  1. 对共享数据进行访问时,乐观锁总是认为不会有其他线程修改数据修改数据
  2. 于是直接执行操作,只是在更时检查数据是否已经被其他线程修改
  3. 如果没有被修改,则操作执行成功;否则,添加其他补偿措施。
  4. 常见的补偿措施是不断尝试,直到成功。
  • Java中的非阻塞同步都是采用这种乐观的并发策略,乐观锁在Java中是通过使用无锁编程来实现,最常使用的CAS操作
  • 比如,线程安全的原子类的自增操作,就是通过循环的CAS操作实现的。
    在这里插入图片描述
② 独占锁和共享锁
  • 独占锁:
  1. 又叫排它锁,同一个锁对象,同一时刻只允许一个线程获取到锁
  2. 如果线程T对数据A加上独占锁后,其他线程不能对该数据再加任何类型的锁(包括独占锁和共享锁),自己可以对数据进行读操作或者写操作。
  3. 独占锁允许线程对数据进行读写操作
  • Java中的 synchronized关键字MutexReentrantLockReentrantReadWriteLock写锁,都是独占锁。
  • 共享锁:
  1. 同一个所对象,同一时刻允许多个线程获取到锁
  2. 线程T对数据A加上共享锁,则其他线程只能对数据A加共享锁,不能加独占锁。
  3. 共享锁只允许对数据进行读操作
  • java中ReentrantReadWriteLock读锁是共享锁。
  • ReentrantReadWriteLock读写锁的获取:
  1. 同步状态不为0,如果有其他线程获取到读锁或者当前线程不是持有写锁的线程,则获取写锁失败进入阻塞状态;否则,当前线程是持有写锁的线程,直接通过setState()方法增加写状态。
  2. 同步状态为0,直接通过compareAndSetState()方法实现写状态的CAS增加,并将当前线程设置为持有写锁的线程。
  3. 如果有其他线程获取到了写锁,则获取读锁失败进入阻塞状态。
  4. 如果写锁未被获取或者该线程为持有写锁的线程,则获取读锁成功,通过compareAndSetState()方法实现读状态的CAS增加
  • 独占锁和共享锁都是通过AQS实现的,tryAcquire()或者tryAcquireShared()方法支持独占式或者共享式的获取同步状态。
③ 公平锁和非公平锁
  • 公平锁:
  1. 当锁被释放,按照阻塞的先后顺序获取锁,即同步队列头节点中的线程将获取锁。
  2. 公平锁可以保证锁的获取按照FIFO原则,但需要进行大量的线程切换,导致吞吐率较低
  • 非公平锁:
  1. 当锁被释放,所有阻塞的线程都可以争抢获取锁的资格,可能导致先阻塞的线程最后获取锁。
  2. 非公平锁虽然可能造成线程饥饿,但极少进行线程的切换,保证了更大的吞吐量
  • Java中ReentrantLockReentrantReadWriteLock支持公平和非公平访问,而synchronized关键字只支持非公平访问。
  • 公平与非公平可以通过构造函数的fair参数进行指定,默认是false,即默认为非公平的获取锁
  • 公平和非公平都是依靠AQS实现的,公平使用FairSync同步器,非公平使用NoFairSync同步器。
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}
④ 可重入锁和非可重入锁

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。下面用示例代码来进行分析:

  • 可重入锁:
  1. 已经获取锁的线程再次获取该锁而不被锁所阻塞,需要解决线程再次获取锁锁的最终释放两个问题。
  2. 可重入锁可以一定程度的避免死锁
    在这里插入图片描述
  • 非可重入锁:
  1. 已经获取锁的线程再次获取该锁,会因为需要等待自身释放锁而被阻塞。
  2. 非可重入锁容易造成当前线程死锁,从而使整个队列中线程永久阻塞。
    在这里插入图片描述
  • Java中的synchronized关键字ReentrantLock锁ReentrantReadWriteLock锁支持重进入,其中ReentrantReadWriteLock读锁是支持重进入的共享锁写锁是支持重进入的独占锁
⑤ 无锁VS偏向锁VS轻量级锁VS重量级锁
  • synchronized关键字实现同步的基础是每个对象都是一个锁,它依靠对象头存储锁。
  • 无锁偏向锁轻量级锁重量级锁都是专门针对synchronized关键字设计的、级别从低到高的4种状态。
  • 注意: 锁状态只能升级不能降级
  • 对象头中的第一个字宽叫做Mark Word,用于存储对象的hashCode分代年龄等信息。
  • 其中最后2 bit的标志位,用于标记锁的状态。根据标志位的不同,可以有如下几种状态:
    在这里插入图片描述

无锁

  • 不对资源进行锁定,所有的线程都可以访问并修改同一资源,但同一时刻只有一个线程能修改成功。
  • 无锁的修改操作依靠循环实现: 如果没有争用,修改成功并退出循环;否则,循环尝试修改操作,直到成功。
  • 无锁无法全面代替有锁,但在某些场景下具有非常高的性能。
  • 无锁的经典实现: CAS操作。

偏向锁

  • 出现的原因:
  1. 在无竞争的情况下,同一线程可能多次进入同一个同步块,即多次获取同一个锁。
  2. 如果进入和退出同步块都使用CAS操作来加锁和解锁,则会消耗一定的资源。
  3. 于是通过CAS操作将线程ID存储到Mark Word中,线程再次进入或退出同步块时,直接检查Mark Word是否存储指向当前线程的偏向锁。如果存储了,则直接进入或退出同步块。
  • 偏向锁可以在无竞争的情况下,尽量减少不必要的轻量级锁执行路径。轻量级锁的加锁和解锁都需要CAS操作,而偏向锁只有将线程ID存储到Mark Word中时才执行一次CAS操作
  • 偏向锁的释放:
  1. 当有其他线程竞争偏向锁时,持有偏向锁的线程会释放锁偏向锁。
  2. 释放时,会根据锁对象是否处于锁定状态而恢复到不同的状态。
  3. 如果锁对象处于未锁定状态,撤销偏向后恢复到无锁的状态0 + 01 );如果锁对象处于锁定状态,撤销偏向后恢复到轻量级锁的状态00)。
  • 偏向锁在JDK1.6及以后,默认是启用的,即-XX:+UseBiasedLocking。可以通过-XX:-UseBiasedLocking关闭偏向锁。

轻量级锁

  • 多个线程竞争同步资源时,没有获取到资源的线程自旋等待锁的释放
  • 加锁过程:
  1. 线程进入同步块时,如果同步对象处于无锁状态0 + 01),JVM 首先在当前线程的栈帧中开辟一块叫做锁记录Lock Record)的空间,用于存储同步对象的Mark Word的拷贝。这个拷贝加了一个前缀,叫Displaced Mark Word
  2. 然后通过CAS操作将同步对象的Mark Word更新为指向Lock Record的指针,并将Lock Record里的owner指针指向同步对象的Mark Word
  3. 如果这个更新动作成功,则当前线程拥有了该对象的锁,Mark Word中的标志位更新为00表示对象处于轻量级锁定状态
  4. 如果更新动作失败,JVM首先会检查同步对象的Mark Word是否指向当前线程的栈帧。如果是,说明当前线程已经持有了该对象的锁,可以直接进入同步块继续执行;否则,说明存在多线程竞争锁。
  • 轻量级锁升级为重量级锁:
  1. 若当前只有一个线程在等待,则通过自旋进行等待。自旋超过一定的次数,轻量级锁升级为重量级锁。
  2. 若一个线程持有锁,一个线程自旋等待锁,又有第三个线程想要获取锁,轻量级锁升级为重量级锁。
  • 锁的释放:
  1. 通过CAS操作,将Lock Record中的Displaced Mark Word与对象中的Mark Word进行替换。
  2. 替换成功,同步状态完成;替换失败,说明有其他线程尝试获取过该锁,释放锁的同时需要唤醒被挂起的线程

重量级锁

  • 多线程竞争同步资源时,没有获取到资源的线程阻塞等待锁的释放
  1. 轻量级锁升级为重量级锁,锁的标志位变成10Mark Word中存储的是指向重量级锁的指针
  2. 所有等待锁的线程都会进入阻塞状态。
⑥ 自旋锁与自适应自旋锁
  • 自旋锁:
  1. 阻塞或唤醒一个线程都需要从用户态切换到内核态去完成,会对性能造成很大影响。
  2. 有时一个线程持有锁的时间很短,如果在很短的时间内让后续获取锁的线程都进入阻塞态,这是很不值得。
  3. 可以让后续线程持有CPU时间等待一会,这个等待需要执行忙循环(自旋) 来实现。
  4. 自旋等待的时间由自旋次数来衡量,默认为10,可以使用-XX:PreBlockSpin来进行设置。
  5. 如果在自旋等待中,持有锁的线程释放该锁,当前线程可以不必阻塞直接获取同步资源
  6. 如果超过自旋次数仍未获取成功,则使用传统的方法将其阻塞
  • 自旋锁的实现原理: 循环的CAS操作
  • 自旋锁的缺点:
  1. 自旋锁虽然避免了线程的切换开销,但是会占用CPU时间。
  2. 如果每个等待获取锁的线程总是自旋规定的次数,却又没有等到锁的释放,这样就白白浪费了CPU时间
  • 自旋锁在JDK1.4.2中引入,默认是关闭的;在JDK1.6中变成默认开启,并为了解决自旋锁中浪费CPU资源的问题,而引入了自适应自旋锁
  • 自适应自旋锁:
  1. 自适应意味着自旋的次数不再固定,而是根据上一次在同一个锁自旋的次数锁的拥有者的状态来决定。
  2. 如果在同一个锁对象上自旋刚刚成功获取过锁,并持有锁的线程处于运行状态,则可以认为这一次自旋也很可能成功,允许它自旋更长的时间。
  3. 如果在一个锁上,自旋很少成功,则下一次可以省略自旋过程,直接阻塞线程,避免浪费处理器资源。
2. 锁的有关问题总结

1. Java中的乐观锁与悲观锁

  • 基础: 什么是乐观锁,什么是悲观锁?二者的典型代表(非阻塞同步和互斥同步)
  • 进阶: CAS如何实现原子更新的;JUC包中的原子类如何实现线程安全的自增。

2. 一个线程怎么判断自己是否可以获得共享资源的锁?

  • Lock的实现类,线程在调用 lock()方法获取锁时,lock()方法会调用AQS中的模板方法,模板方法会调用AQS中的可重写方法。在可重写方法中,会通过判断同步状态,决定是否可以获取共享资源的锁。
  • 深入举例:
  1. ReentrantLock的公平和非公平获取锁:同步状态为0不为0的情况。
  2. ReentrantReadWriteLock写锁获取: 同步状态不为0为0的情况。
  3. ReentrantReadWriteLock读锁的获取: 不是持有写锁的线程,获取失败;其他情况获取成功。

3. 共享资源state何时增加何时减少?对于synchronized和lock有什么区别?

  • 加锁state的值加1,解锁state的值减1,state = 0 表示锁被释放。
  • synchronized和lock都支持重进入:lock依靠AQS中的同步状态synchronized依靠对象头中Mark Word的锁标志位处于可偏向状态1 + 01)。

4. 对于++i操作,如何不使用锁进行同步,保证其线程安全?

  • JUC包中的原子类的自增运算(incrementAndGet()或者compareAndSet()),实质: 循环的CAS操作。

5. CAS操作的实现机制?

  • 基础: 如何实现原子更新的、Java中对CAS的支持
  • 进阶:
  1. 如何使用CAS操作实现非同步互斥,以原子类的自增运算为例。
  2. CAS操作存在的问题:ABA问题、循环时间过长消耗大、只能保证一个共享变量的原子操作。

6. 公平锁与非公平锁

  • 基础: 什么是公平锁,什么是非公平锁。
  • 进阶:
  1. synchronized只支持非公平访问, ReentrantLockReentrantReadWriteLock支持公平与非公平访问。
  2. ReentrantLock为例,讲解如何支持公平与非公平的:构造函数中指定fair参数,对应的AQS为FairSync或者NonfairSync,公平访问要求没有前驱节点。

7. lock ,sychronized,volatile的区别

  • lock的特性: 非阻塞获取锁、可中断获取锁、超时获取锁;lock接口的几种方法;常见的Lock的实现类。
  • synchronized的同步基础,如何实现同步。
  • volatile保证变量在线程间的可见性禁止指令重排序。只适合运算的结果不依赖当前变量值得情况,无法解决线程同步。
  • 总结:sychronizedReentrantLock为例,二者的异同:实现、性能、是否可中断、公平性支持、是否可绑定多个对象。

  • lock和synchronized的区别:
  1. 实现: lock由jdk支持,synchronized由JVM支持;导致前者需要显式的获取、释放锁;后者由JVM隐式完成。
  2. 性能: synchronized进行了很多的优化,目前二者的性能大致相同。
  3. lock的特性: 支持非阻塞获取(tryLock)、中断获取(lockinterruptibly)、超时获取(带参数的tryLock),而synchronized不支持。
  4. 二者的实现机制: synchronized依靠进入和退出monitor对象,实现同步方法或同步代码块;lock依靠AQS实现锁的获取和释放。
  5. 线程间的协作: synchronized依靠Object的监视器方法wait()notify()/notifyAll(),实现等待/通知模式;lock接口的实现类,依靠绑定的condition对象的await()signal()/signalAll(),实现等待/通知模式。

8. 谈一下Java中的锁

  • 锁是通过互斥同步实现Java线程安全的一种手段,JVM以synchronized关键字提供锁功能,JDK1.5及以后提供依靠Lock及其实现类提供锁功能。
  • 讲解方法一:
  1. synchronized关键字:实现同步的基础,锁存储的位置、如何实现同步。[ 如何保证原子性、可见性、顺序性 ]
  2. Lock接口: 如何借助AQS实现锁;ReentrantLock的重进入、公平与非公平;ReentrantReadWriteLock的写锁/读锁的获取。
  3. synchronizedReentrantLock的比较与选择
  4. 锁的优化:自旋锁与自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁
  • 讲解方法二:
  1. 独占锁与共享锁公平锁与非公平锁可重进入锁与非可重进入锁乐观锁与悲观锁自旋锁与自适应自旋锁、无锁VS偏向锁VS轻量级锁VS重量级锁,它们的含义、具体的实例等

9. synchronized关键字和ReentrantLock

  • 基础: synchronized的同步基础、锁存储的位置、如何实现同步;ReentrantLock的特性重进入、公平与非公平
  • 进阶: 二者的比较与选择

10. 共享锁与独占锁

  • 独占锁: 一个线程持有锁,其他线程不能再获取锁,无论执行读操作还是写操作
  • 共享锁: 一个线程持有读锁,其他线程可以在获取读锁,不能再获取写锁

11. 单例模式如何解决高并发?

  • DCL(双重锁检测)的单例模式:instance定义为volatile,使用synchronized再次进行instancenull的判断。
  • 重点: 两次null判断的意义,添加volatile关键字的意义。

12. AQS和condition对象的关系

  • ConditionObject是AQS的内部类,一个AQS不仅拥有自身的同步队列,还拥有 ConditionObject的等待队列;而且,一个AQS可以绑定多个condition对象。
  • 调用condition对象的await()方法时,要求当前线程已经获取到锁。即该线程处于同步队列的头节点中。接着当前线程释放该并将自己封装成新的节点加入到等待队列中,进入等待状态;从AQS的角度看,调用await()方法时,节点从同步队列的头节点移动到等待队列的尾节点
  • 调用condition对象的signal()方法时,会唤醒处于等待队列中等待最久的节点,即等待队列的头节点;线程想从await()方法返回,必须获取到锁,因此线程又会封装成同步节点,加入到同步队列中。从AQS的角度看,调用signal()方法时,节点从等待队列的头节点移动到同步队列的尾节点

13. lock接口的实现

  1. 定义lock接口的实现类,在其中创建AQS的子类(静态内部类)作为同步器;
  2. 实现AQS的子类: 调用更改同步状态的三种核心方法,实现AQS中提供的可重写方法。
  3. 实现lock接口中的方法: 调用同步器中的模板方法,实现lock接口的lock()unlock()等方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java高并发之锁总结、常见的面试问题 的相关文章

  • IntelliJ IDEA中生成jar包

    IntelliJ IDEA中的java项目 比如 myproject 可以生成jar包 本文以IntelliJ IDEA 2018 2 5版本为例进行介绍 方法如下 1 依次选择菜单 File gt Project Structure 打开
  • (转)如何正确地处理时间

    from http www liaoxuefeng com article 0014132675721847f569c3514034f099477472c73b5dee2000 日期和时间在程序中应用广泛 每种程序开发语言都自带处理日期和时
  • java注解与反射的基本使用(这一篇就够了!)

    一 注解 Annotation 1 什么是注解 相信大家对注解应该并不陌生 在现在信息飞速发展的年代 各种优秀的框架或许都离不开注解的使用 像我们在实现接口一个方法时 也会有 Override注解 注解说白了就是对程序做出解释 与我们在方法
  • EasyExcel——多sheet、有合并单元格的excel导入

    EasyExcel 读Excel官方文档链接 maven依赖
  • MongoDB学习笔记番外篇:JDBC方式操作MongoDB示例

    1 pom xml中依赖包设置 在项目中引入MongoDB JDBC 驱动mongo java driver X X X jar
  • Java使用Mybatis-Plus实现根据参数动态拼接查询条件

    在编写代码的过程中我们常常会遇到下面的业务场景 我们需要根据传进来的参数来去进行拼接查询 例如当前端传过来的参数是base 那么我们就需要在Mybatis Plus的条件构造其中写出如下语句 public PageUtils queryBa
  • Java枚举类常量写法

    在写代码的过程中我们常常需要定义一些常量 以下代码是使用枚举类型定义常量的实例 有需要大家可以进行参考 public class MyConstant public enum StatusEnum CREATED 0 状态0 ASSIGNE
  • mysql的JDBC架包下载及简单测试连接

    一 下载JDBC连接所需要的jar包 选择Communityhttps www mysql com downloads 二 导入jar包 1 解压下载的安装包 2 eclispe项目导入jar包 方式一 Build Path gt Conf
  • 分布式应用部署模式下的Quartz配置

    本来计划做一次应用的部署升级 由单机模式 改为集群模式 但是在考虑方案时 除了遇到的SpringBoot优雅退出问题 还有一个需要考虑的问题 就是Quartz定时任务的处理 单机模式下 quartz定时任务很简单 按照文档使用即可 使用RA
  • Java并发

    Java并发 学习资料 Java并发 知识点概述 Java并发 基础 并行和并发 并行是指 并排行走 或 同时实行或实施 在操作系统中是指 一组程序按独立异步的速度执行 无论从微观还是宏观 程序都是一起执行的 对比地 并发是指 在同一个时间
  • Checkstyle检查规则

    Checkstyle是一个检查java文件编码规范的开源工具 最新版本支持184个检查规则 Checkstyle官网如下 https checkstyle sourceforge io Checkstyle的GitHub地址如下 https
  • Java高并发之锁总结、常见的面试问题

    1 锁的分类 乐观锁与悲观锁 悲观锁 对共享数据进行访问时 悲观锁总是认为一定会有其他线程修改数据 如果不加锁 肯定会出问题 因此 悲观锁无论是否出现共享数据的争用 在访问数据时都会先加锁 Java中同步互斥都是采用这种悲观的并发策略 sy
  • Invalid or unexpected token:数据格式错误

    Uncaught SyntaxError Invalid or unexpected token 翻译成中文是 捕获的查询无效或意外的标记 代码逻辑没问题 那么就是数据问题了 把页面要展示的数据全部检查一遍后 果然发现疑点 1 多了单引号
  • 线程同步之Synchronized&CAS&各种锁的介绍及对比

    1 Synchronized 1 1 简介 Java的关键字 提供了并发场景下的数据可见性和原子性 保证线程安全 1 2 应用方式 修饰实例方法 对当前实例加锁 当两个不同的实例对象同时操作共享资源时 可能出现线程安全问题 public s
  • JavaDoc注释的使用跟导出JavaDoc文档

    1 Javadoc是什么 JavaDoc是Sun公司提供一种从程序源代码中抽取类 方法 成员等注释形成一个和源代码配套的API帮助文档技术 但是需要在编写程序时以一套特定的标签作注释 在程序编写完成 后 通过Javadoc就可以同时形成程序
  • Swagger常用注解强调点说明

    Swagger注解 常用注解 Api 用于类 一般用于controller类 表示 标识这个类是swagger的资源 显示在文档中 ApiOperation 用于方法 一般用于controller中的方法上 表示一个http请求的操作 Ap
  • 警告: Unable to find required classes (javax.activation.DataHandler and javax.mail

    在调试Axis1 4访问WebService服务时 出现以下警告 警告 Unable to find required classes javax activation DataHandler and javax mail internet
  • java判断是否为金额

    金额验证 public static boolean isNumber String str java util regex Pattern pattern java util regex Pattern compile 1 9 1 d 0
  • 2. IDEA + maven + protobuf配置(on mac)

    1 絮絮叨叨 都说懒惰是人类进步的源泉 有时候想想还真就那么回事 学习了如何使用protoc命令编译 重度依赖IDEA且已经习惯了maven的我 就在想是否能在IDEA中一键编译 proto文件 2 vscode配置protobuf编辑环境
  • 代码点(code point)和代码单元(code units)

    1 解释一 char Java中 char类型为16个二进制位 原本用于表示一个字符 但后来发现 16位已经不够表示所有的字符 所以后来发展出了代码点表示字符的方法 代码点 code point 是指编码字符集中 字符所对应的数字 有效范围

随机推荐

  • springboot+jsp教育机构OA系统(源码免费获取+论文+答辩PPT)

    技术架构 springboot mybatis springmvc jsp mysql 功能模块 整个系统分为三种角色 1 系统管理员 2 上级角色 3 普通教师 其中系统管理员需要的功能 部门人员管理功能 档案信息的添加 工作管理功能 上
  • python爬虫案例-跳过百度验证,接口调用实现百度搜索功能

    需求背景 我们有自己的平台 但是希望在我们的平台上面想要实现一个百度搜索的接口 输入想要搜索的内容 模拟百度搜索 将返回的内容再展现在我们自己的平台中 提供给用户查看 coding utf8 import hashlib import ra
  • QT自定义类型作为槽函数的参数

    QT自定义类型作为槽函数的参数 正常情况下信号与槽之间只能传递通用数据类型 如 int 像QVector
  • 数据结构——小白入门篇

    数据结构 小白入门篇 浅谈学习心得 我为什么想要学数据结构 在计算机界有这样一个万能公式 数据结构 算法 程序 在如今这计算机引领风骚的时代 不学数据结构 你凭什么想要做时代的弄潮儿 所以我毅然决然的提前自学了数据结构 学习数据结构前的我是
  • vue3 中使用 element UI 3 (vite 和 webpack)

    Element Plus官方文档 一 安装 NPM npm install element plus save Yarn yarn add element plus pnpm pnpm install element plus 如果您的网络
  • 15个高清壁纸网站推荐

    15个高清壁纸网站推荐 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 给大家推荐个人比较喜欢的几个壁纸高质量壁纸网站 极简壁纸 推荐 WallpaperCave CGWALLPAPERS 游戏壁纸 H128壁纸 Magdeleine Up
  • DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之1: 开场白

    在开场白之前的说明 这是 DirectX 9 0c游戏开发手记 的第一部分 叫做 龙书 第二版学习笔记 讲的是我做 龙书 第二版 原名Introduction to 3D GameProgramming with DirectX 9 0c
  • 浅析单向tvs管和双向tvs管的对比,谁能更胜一筹

    瞬态抑制二极管 TransientVoltageSuppressor 简称TVS管 是一种二极管形式的高效能保护器件 当TVS管的两极受到反向瞬态高能量冲击时 它能以10的负12次方秒量级的速度 将其两极间的高阻抗变为低阻抗 吸收高达数千瓦
  • C高级笔记总结

    GCC 1 gcc 组件 1 分析器 分析语法结构 将C语言编译汇编语言 s 2 汇编器 将汇编代码编译成二进制文件 3 链接器 链接目标文件以及库文件 生成可执行代码 4 标准C库 提供核心的C库函数 scanf printf 2 gcc
  • mysql服务无法启动解决办法

    第一步先查看是不是端口号被占用 netstat aon findstr 3306 33060是mysql8 0 版本的扩展端口 果然被占用 强制终止进程 强制终止进程 11536 taskkill F pid 11536
  • Eastmount博客导读:专栏系统分类和博客归纳总结

    为了更好地帮助博友学习作者的博客 方便作者自己归纳总结专栏 本文详细介绍了作者八年来 在CSDN写的各种专栏 各种系列文章 八年来 作者经历了从本科到硕士 到贵州教书成家 再到现在的博士 八年来 作者学得很杂很宽 绝大多数专栏都是从零学起
  • Broken pipe产生原因分析

    一 Broken pipe产生原因分析 1 当访问某个服务突然服务器挂了 就会产生Broken pipe 2 客户端读取超时关闭了连接 这时服务器往客户端再写数据就发生了broken pipe异常 二 方案 1 问题一分析服务器为什么挂了
  • 可充电电池安规认证标准、GB 9706.1-2020对医用电气设备中电池的要求

    目录 可充电电池 安规认证标准 IEC 62133 标准主要包含以下项目的测试及验证 在这些测试及验证项目中 大部分均是常见的常规测试项目 但仍有部分项目值得留意及关注 UN38 3运输认证 UN38 3测试项目 GB 9706 1 202
  • mybatis 动态表名insert 传入表名、字段名、数据

    mybatis 动态insert 传入表名 字段名 数据 主要是实现不同的表名进行插入然后进行操作 可以使用MybatisPlus自带的过滤器进行配置 MybatisPlusConfig 测试方法如下 RunWith SpringRunne
  • 关于vue 引入两个版本echarts的坑。

    项目开发中 前端非要使用echarts3 0版本 我的业务又有地图需要显示 吐槽一下后端开发招进来变前端 一开始是引用了5 0版本的js文件 后来踩了很多坑就改成引用别名 控制台输入 npm i echarts5 npm echarts 5
  • .natvis的文件来问题总结 .natvis的文件来

    VS调试STL问题总结 C Program Files x86 Microsoft Visual Studio 2017 Community Common7 Packages Debugger Visualizers https www c
  • python实现Word2Vec+哈夫曼树+skip-gram

    阅读这篇之前如果对于层次softmax不清楚可以先看看http 124 222 190 191 8090 archives word2vec zhong de ha fu man shu 再来阅读代码 你将会有意外收获 1 数据集 百度云网
  • [Qt Quick] No rule to make target问题解决办法

    问题描述 修改项目中资源的qml文件名或删除无用资源文件后 重新构建项目时 会出现类似如下的问题提示 No rule to make target aaa needed by bbb Stop 使用快捷键 Alt 4 定位到编译输出窗口 可
  • 【IAP】IAP在线升级流程

    IAP 全称是 In Application Programming 中文解释为 在程序中编程 不同于ISP通过设置MCU内部的BootLoader程序引导烧写或者是ICP通过SWD JTAG在线仿真烧写 IAP是一种对通过微控制器的对外接
  • Java高并发之锁总结、常见的面试问题

    1 锁的分类 乐观锁与悲观锁 悲观锁 对共享数据进行访问时 悲观锁总是认为一定会有其他线程修改数据 如果不加锁 肯定会出问题 因此 悲观锁无论是否出现共享数据的争用 在访问数据时都会先加锁 Java中同步互斥都是采用这种悲观的并发策略 sy