当前位置: 首页 > news >正文

JUC之Java内置锁的核心原理

文章目录

      • JUC之Java内置锁的核心原理
        • Java对象结构
          • 对象头
          • 对象体
          • 对齐字节
        • Mark Word的结构信息
          • 64位Mark Word的构成
        • 偏向锁
          • 偏向锁的设置
          • 偏向锁的重偏向
          • 偏向锁的撤销
          • 偏向锁的膨胀
        • 轻量级锁
          • 执行过程
          • 轻量级锁的分类
            • 普通自旋锁
            • 自适应自旋锁
        • 重量级锁
        • 偏向锁、轻量级锁与重量级锁的对比

JUC之Java内置锁的核心原理

​ Java内置锁是一个互斥锁,这就意味着最多只有一个线程能够获 得该锁,当线程B尝试去获得线程A持有的内置锁时,线程B必须等待或 者阻塞,直到线程A释放这个锁,如果线程A不释放这个锁,那么线程B 将永远等待下去。

​ Java中每个对象都可以用作锁,这些锁称为内置锁。线程进入同 步代码块或方法时会自动获得该锁,在退出同步代码块或方法时会释 放该锁。获得内置锁的唯一途径就是进入这个锁保护的同步代码块或 方法。

Java对象结构

Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节。

结构如下:

在这里插入图片描述

对象头

​ 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的数据,例如GC标志位、哈希码、锁状态信息等。

​ 第二个字段叫作Class Pointer(类对象指针),用于存放方法区Class对象的地址,虚拟机通过这个指针来确定这个对象是哪个类的实例。

​ 第三个字段叫作Array Length(数组长度)。如果对象是一个Java数组,那这个字段必须要有,用于记录数组长度的数据;如果对象不是一个Java数组,那么此字段不存在,所以这是一个可选字段。

对象体

​ 对象体包含对象的实例变量(成员变量),用于成员属性值,包括父类的成员属性值。这部分内存按4字节对齐。对象体是对象的主体部分,占用的内存空间大小取决于对象的属性数量和类型。

对齐字节

​ 对齐字节也叫作填充对齐,其作用是用来保证Java对象所占内存 字节数为8的倍数HotSpot VM的内存管理要求对象起始地址必须是8字 节的整数倍。对象头本身是8的倍数,当对象的实例变量数据不是8的 倍数时,便需要填充数据来保证8字节的对齐。

​ 对齐字节并不是必然存在的,也没有特别的含义,它仅仅起 着占位符的作用。当对象实例数据部分没有对齐(8字节的整数倍) 时,就需要通过对齐填充来补全。

Mark Word的结构信息

​ Java内置锁涉及很多重要信息,这些都存放在对象头的Mark Word字段中。Mark Word不会受到Oop指针压缩选项的影响。Java内置锁的状态总共有4种,级别由低到高依次为:无锁、偏向锁、轻量级锁和重量级锁。在JDK1.6之前只有重量级锁,之后才引入偏向锁和轻量级锁。4种锁状态会随着竞争的情况逐渐升级,而且不可逆,即只能进行锁升级,不会发生锁降级。

不同锁状态下32位Mark Work的结构信息:

在这里插入图片描述

不同锁状态下64位Mark Work的结构信息:

在这里插入图片描述

64位Mark Word的构成
  1. lock:锁状态标记位,占两个二进制位。该标记的 值不同,整个Mark Word表示的含义就不同。
  2. biased_lock:对象是否启用偏向锁标记,只占1个二进制 位。为1时表示对象启用偏向锁,为0时表示对象没有偏向锁。
  3. age:4位的Java对象分代年龄。在GC中,对象在Survivor区 复制一次,年龄就增加1。当对象达到设定的阈值时,将会晋升到老年 代。默认情况下,并行GC的年龄阈值为15,并发GC的年龄阈值为6。由 于age只有4位,因此最大值为15,这就是-XX:MaxTenuringThreshold 选项最大值为15的原因。
  4. identity_hashcode:31位的对象标识HashCode(哈希码) 采用延迟加载技术,当调用Object.hashCode()方法或者 System.identityHashCode()方法计算对象的HashCode后,其结果将被 写到该对象头中。当对象被锁定时,该值会移动到Monitor(监视器) 中。
  5. thread:54位的线程ID值为持有偏向锁的线程ID。
  6. epoch:偏向时间戳。
  7. ptr_to_lock_record:占62位,在轻量级锁的状态下指向栈帧中锁记录的指针。
  8. ptr_to_heavyweight_monitor:占62位,在重量级锁的状态下指向对象监视器的指针。

32位的Mark Word与64位的Mark Word结构相似

偏向锁

​ 如果一个同步块(或方法)没有多个线程竞争, 而且总是由同一个线程多次重入获取锁,如果每次还有阻塞线程,唤 醒CPU从用户态转为核心态,那么对于CPU是一种资源的浪费,为了解 决这类问题,就引入了偏向锁的概念。偏向锁主要解决无竞争下的锁性能问题,所谓的偏向就是偏心, 即锁会偏向于当前已经占有锁的线程。

​ 原理:如果不存在线程竞争的一个线程获得了锁,那么锁就进入偏向状态,此时Mark Word的结构变为偏向锁结构, 锁对象的锁标志位(lock)被改为01,偏向标志位(biased_lock)被改为1,然后线程的ID记录在锁对象的Mark Word中(使用CAS操作完 成)。以后该线程获取锁时判断一下线程ID和标志位,就可以直接进 入同步块,连CAS操作都不需要,这样就省去了大量有关锁申请的操作,从而也就提升了程序的性能。

偏向锁的设置

​ 如果开启了偏向锁(默认开启),那么对象创建后,markword值为0x05即最后3位为101,这时它的thread、epoch、age都为0;如果没有开启偏向锁,那么对象创建后,markword值为0x01即最后3位位001,这时它的hashcode、age都为0,第一次用到hashcode时才会赋值。使用-XX:-UseBiasedLocking可以禁用偏向锁。

​ 偏向锁是默认延迟的,不会在程序启动时立即生效,如果想避免延迟,可以加VM参数-XX:BiasedLockingStartupDelay=0 来禁用延迟。

偏向锁的重偏向

​ 如果对象虽然被多个线程访问,但没有竞争,这时偏向了线程T 1 的对象仍有机会重新偏向T 2 ,重偏向会重置对象的 Thread ID。当撤销偏向锁阈值超过20次后,(从第二十次开始)jvm之后在给这些对象加锁时重新加偏向锁至新的线程。

偏向锁的撤销

偏向锁的撤销过程:

  1. 在一个安全点停止拥有锁的线程。
  2. 遍历线程的栈帧,检查是否存在锁记录。如果存在锁记录, 就需要清空锁记录,使其变成无锁状态,并修复锁记录指向的Mark Word,清除其线程ID。
  3. 将当前锁升级成轻量级锁。
  4. 唤醒当前线程。

​ 所以,如果某些临界区存在两个及两个以上的线程竞争,那么偏 向锁反而会降低性能。在这种情况下,可以在启动JVM时就把偏向锁的 默认功能关闭。

撤销偏向锁的情况:

  1. 多个线程竞争偏向锁。
  2. 调用偏向锁对象的hashcode()方法或者 System.identityHashCode()方法计算对象的HashCode之后,将哈希码 放置到Mark Word中,内置锁变成无锁状态,偏向锁将被撤销。
  3. 调用 wait/notify,这个只有重量级锁才有

当撤销偏向锁阈值超过40次后,(从第四十次开始)jvm会将整个类的所有对象都变为不可偏向的,新建的对象也会是不可偏向的。

偏向锁的膨胀

​ 如果偏向锁被占据,一旦有第二个线程争抢这个对象,因为偏向 锁不会主动释放,所以第二个线程可以看到内置锁偏向状态,这时表 明在这个对象锁上已经存在竞争了。JVM检查原来持有该对象锁的占有 线程是否依然存活,如果挂了,就可以将对象变为无锁状态,然后进 行重新偏向,偏向为抢锁线程。

​ 如果JVM检查到原来的线程依然存活,就进一步检查占有线程的调 用堆栈是否通过锁记录持有偏向锁。如果存在锁记录,就表明原来的 线程还在使用偏向锁,发生锁竞争,撤销原来的偏向锁,将偏向锁膨胀(INFLATING)为轻量级锁。

轻量级锁

使用场景:如果一个对象虽然有多线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。

轻量级锁的本意是为了减少多线程进入操作系统底层的互斥锁 (Mutex Lock)的概率,并不是要替代操作系统互斥锁。所以,在争 用激烈的场景下,轻量级锁会膨胀为基于操作系统内核互斥锁实现的 重量级锁。

执行过程

(1)在抢锁线程进入临界区之前,如果内置锁 (临界区的同步对象)没有被锁定,JVM首先将在抢锁线程的栈帧中建 立一个锁记录(Lock Record),用于存储对象目前Mark Word的拷 贝,这时的线程堆栈与内置锁对象头大致如图所示,

在这里插入图片描述

(2)然后抢锁线程将使用CAS自旋操作,尝试将内置锁对象头的Mark Word的ptr_to_lock_record(锁记录指针)更新为抢锁线程栈帧中锁 记录的地址,如果这个更新执行成功了,这个线程就拥有了这个对象锁。然后JVM将Mark Word中的lock标记位改为00(轻量级锁标志), 即表示该对象处于轻量级锁状态。

(3)抢锁成功之后,JVM会将Mark Word 中原来的锁对象信息(如哈希码等)保存在抢锁线程锁记录的 Displaced Mark Word(可以理解为放错地方的Mark Word)字段中, 再将抢锁线程中锁记录的owner指针指向锁对象。

在轻量级锁抢占成功之后,锁记录和对象头的状态如图所示,

在这里插入图片描述

如果cas失败,有两种情况:

  1. 如果是其他线程已经持有了该Object的轻量级锁,这时表明有就竞争,进入锁膨胀过程
  2. 如果是自己执行了 synchronized 锁重入,那么再添加一条 Lock Record 作为重入的计数

当退出 synchronized 代码块(解锁时)如果有取值为null的锁记录,表示有重入,这时重置锁记录,表示重入计数减一。

当退出 synchronized 代码块(解锁时)锁记录的值不为null,这时使用 cas 将 Mark Word 的值恢复给对象头,成功则解锁成功,失败说明轻量级锁已经进行了锁膨胀或者已经升级为重量级锁,进入重量级锁的解锁流程。

轻量级锁的分类

轻量级锁主要有两种:普通自旋锁和自适应自旋锁。

普通自旋锁

​ 普通自旋锁指当有线程来竞争锁时,抢锁线程会在原 地循环等待,而不是被阻塞,直到那个占有锁的线程释放锁之后,这 个抢锁线程才可以获得锁。

​ 锁在原地循环等待的时候是会消耗CPU的,就相当于在执行一个 什么也不干的空循环。所以轻量级锁适用于临界区代码耗时很短的场 景,这样线程在原地等待很短的时间就能够获得锁了。默认情况下,自旋的次数为10次,用户可以通过XX:PreBlockSpin选项来进行更改。

自适应自旋锁

​ 自适应自旋锁就是等待线程空循环的自旋次数并非是固定 的,而是会动态地根据实际情况来改变自旋等待的次数,自旋次数由 前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。

  • 如果抢锁线程在同一个锁对象上之前成功获得过锁,JVM就 会认为这次自旋很有可能再次成功,因此允许自旋等待持续相对更长 的时间。
  • 如果对于某个锁,抢锁线程很少成功获得过,那么JVM将可 能减少自旋时间甚至省略自旋过程,以避免浪费处理器资源。

JDK 1.6的轻量级锁使用的是普通自旋锁,且需要使用XX:+UseSpinning选项手工开启。JDK 1.7后,轻量级锁使用自适应自旋 锁,JVM启动时自动开启,且自旋时间由JVM自动控制。

重量级锁

​ JVM中每个对象都会有一个监视器,监视器和对象一起创建、销 毁。监视器相当于一个用来监视这些线程进入的特殊房间,其义务是 保证(同一时间)只有一个线程可以访问被保护的临界区代码块。本质上,监视器是一种同步工具,也可以说是一种同步机制,监听器主要有两个特点。

  • 同步。监视器所保护的临界区代码是互斥地执行的。一个监 视器是一个运行许可,任一线程进入临界区代码都需要获得这个许 可,离开时把许可归还。
  • 协作。监视器提供Signal机制,允许正持有许可的线程暂时 放弃许可进入阻塞等待状态,等待其他线程发送Signal去唤醒;其他 拥有许可的线程可以发送Signal,唤醒正在阻塞等待的线程,让它可 以重新获得许可并启动执行。

在Hotspot虚拟机中,监视器是由C++类ObjectMonitor实现的,ObjectMonitor的Owner(_owner)、WaitSet(_WaitSet)、 Cxq(_cxq)、EntryList(_EntryList)这几个属性比较关键。ObjectMonitor的WaitSet、Cxq、EntryList这三个队列存放抢夺重量 级锁的线程,而ObjectMonitor的Owner所指向的线程即为获得锁的线 程。

  • Cxq:竞争队列(Contention Queue),所有请求锁的线程 首先被放在这个竞争队列中。
  • EntryList:Cxq中那些有资格成为候选资源的线程被移动到 EntryList中。
  • WaitSet:某个拥有ObjectMonitor的线程在调用 Object.wait()方法之后将被阻塞,然后该线程将被放置在WaitSet链 表中。

ObjectMonitor的内部抢锁过程如图所示:

在这里插入图片描述

(1) Cxq

​ Cxq并不是一个真正的队列,而是一个由Node及其next指针逻辑构成的虚拟队列。每 次新加入Node会在Cxq的队头进行,通过CAS改变第一个节点的指针为 新增节点,同时设置新增节点的next指向后续节点;从Cxq取得元素 时,会从队尾获取。Cxq结构是一个无锁结构。

​ 在线程进入Cxq前,抢锁线程会先尝试通过CAS自旋获取锁,如果 获取不到,就进入Cxq队列,这明显对于已经进入Cxq队列的线程是不 公平的。因此,synchronized同步块所使用的重量级锁是不公平锁。

(2) EntryList

​ EntryList与Cxq在逻辑上都属于等待队列。Cxq会被线程并发访 问,为了降低对Cxq队尾的争用,而建立EntryList。在Owner线程释放 锁时,JVM会从Cxq中迁移线程到EntryList,并会指定EntryList中的 某个线程(一般为Head)为OnDeck Thread(Ready Thread)。 EntryList中的线程作为候选竞争线程而存在。

(3) OnDeck Thread与Owner Thread

​ JVM不直接把锁传递给Owner Thread,而是把锁竞争的权利交给 OnDeck Thread,OnDeck需要重新竞争锁。这样虽然牺牲了一些公平 性,但是能极大地提升系统的吞吐量,在JVM中,也把这种选择行为称 为“竞争切换”。

​ OnDeck Thread获取到锁资源后会变为Owner Thread。无法获得锁 的OnDeck Thread则会依然留在EntryList中,考虑到公平性,OnDeck Thread在EntryList中的位置不发生变化(依然在队头)。

​ 在OnDeck Thread成为Owner的过程中,还有一个不公平的事情, 就是后来的新抢锁线程可能直接通过CAS自旋成为Owner而抢到锁。

(4) WaitSet

​ 如果Owner线程被Object.wait()方法阻塞,就转移到WaitSet队列 中,直到某个时刻通过Object.notify()或者Object.notifyAll()唤 醒,该线程就会重新进入EntryList中。

偏向锁、轻量级锁与重量级锁的对比

synchronized的执行过程:

  1. 线程抢锁时,JVM首先检测内置锁对象Mark Word中的 biased_lock(偏向锁标识)是否设置成1,lock(锁标志位)是否为 01,如果都满足,确认内置锁对象为可偏向状态。
  2. 在内置锁对象确认为可偏向状态之后,JVM检查Mark Word中 的线程ID是否为抢锁线程ID,如果是,就表示抢锁线程处于偏向锁状 态,抢锁线程快速获得锁,开始执行临界区代码。
  3. 如果Mark Word中的线程ID并未指向抢锁线程,就通过CAS操 作竞争锁。如果竞争成功,就将Mark Word中的线程ID设置为抢锁线 程,偏向标志位设置为1,锁标志位设置为01,然后执行临界区代码, 此时内置锁对象处于偏向锁状态。
  4. 如果CAS操作竞争失败,就说明发生了竞争,撤销偏向锁, 进而升级为轻量级锁。
  5. JVM使用CAS将锁对象的Mark Word替换为抢锁线程的锁记录 指针,如果成功,抢锁线程就获得锁。如果替换失败,就表示其他线 程竞争锁,JVM尝试使用CAS自旋替换抢锁线程的锁记录指针,如果自 旋成功(抢锁成功),那么锁对象依然处于轻量级锁状态。
  6. 如果JVM的CAS替换锁记录指针自旋失败,轻量级锁就膨胀为 重量级锁,后面等待锁的线程也要进入阻塞状态。

总体来说,偏向锁是在没有发生锁争用的情况下使用的;一旦有 了第二个线程争用锁,偏向锁就会升级为轻量级锁;如果锁争用很激 烈,轻量级锁的CAS自旋到达阈值后,轻量级锁就会升级为重量级锁。

三种内置锁的对比如图:

在这里插入图片描述

相关文章:

JUC之Java内置锁的核心原理

文章目录 JUC之Java内置锁的核心原理Java对象结构对象头对象体对齐字节 Mark Word的结构信息64位Mark Word的构成 偏向锁偏向锁的设置偏向锁的重偏向偏向锁的撤销偏向锁的膨胀 轻量级锁执行过程轻量级锁的分类普通自旋锁自适应自旋锁 重量级锁偏向锁、轻量级锁与重量级锁的对比…...

【项目经理】论项目经理的自我修养

项目经理的非职权领导力 文章目录 项目经理的非职权领导力一、权利的类型二、构成权利的三要素三、沟通是实施影响力的重要手段3.1 沟通的主要类型3.2 沟通的内容和形式3.3 沟通的主要困难 四、综合沟通协调的技巧4.1 常见的负面反馈4.2 沟通技巧 五、论项目经理的自我修养5.1 …...

知识图谱学习笔记03-知识图谱的作用

语义搜索 知识图谱在语义搜索方面扮演着非常重要的角色。传统的文本搜索引擎基本上是基于关键词匹配的方式进行搜索,这种方式容易受到搜索词语的表述方式和不同语言之间的差异的影响,而无法深入理解用户的意图和查询目的。而知识图谱则提供了一种更加精…...

刚进公司就负责项目,把老弟整蒙了!

刚进公司就负责项目,把老弟整蒙了! 大家好,我是鱼皮,先把封面图送给大家: 又快到周末了,今天分享一些轻松的编程经验~ 还记得我学编程的老弟小阿巴么?他目前大二,听说最近刚刚找到…...

【Python基础入门学习】Python高级变量你了解多少?

认识高级变量 1. 列表 list1.1 列表的定义1.2 列表常用操作关键字、函数和方法 1.3 循环遍历1.4 列表嵌套1.5 应用场景 2. 元组 tuple2.1 元组的定义2.2 元组常用操作2.3 应用场景 3. 字典 dictionary3.1 字典的含义3.2 字典常用操作3.3 应用场景 4. 字符串 string4.1 字符串的…...

《LearnUE——基础指南:上篇—3》——GamePlay架构WorldContext,GameInstance,Engine之间的关系

目录 平行世界是真实存在的吗? 1.3.1 引言 1.3.2 世界管理局(WorldContext) 1.3.3 司法天神(GameInstance) 1.3.4 上帝(Engine) 1.4 总结 平行世界是真实存在的吗? 1.3.1 引言 …...

重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)

重大问题,Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的,但是,今天我将代表所有微软用户,解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…...

修改系统语言字体的方法及注意事项

Android修改系统语言字体 随着我们生活品质的提升,现在人们对于手机的依赖越来越高,而且对于手机的功能也有了更高的要求。其中,界面的字体对于我们视觉的体验感受非常重要。而在Android系统中,默认的字体可能并不符合我们的胃口。…...

19.考虑柔性负荷的综合能源系统日前优化调度模型

说明书 MATLAB代码:考虑柔性负荷的综合能源系统日前优化调度模型 关键词:柔性负荷 需求响应 综合需求响应 日前优化调度 综合能源系统 参考文档:《考虑用户侧柔性负荷的社区综合能源系统日前优化调度》参考柔性负荷和基础模型部分&#xf…...

Midjourney关键词分享!附输出AI绘画参考图

Midjourney 关键词是指用于 Midjourney 这个 AI 绘画工具的文本提示,可以影响生成图像的风格、内容、细节等。Midjourney 关键词有一些基本的语法规则和套用公式,也有一些常用的风格词汇和描述词汇,这里我以10张不同风格和类型的美女图为例&a…...

网络安全行业就职岗位有哪些?

网络安全作为目前最火的行业之一,它的细分方向很多。下面介绍一下网络安全主要的方向岗位有哪些,以及职责是什么? 一、安全规划与设计方向 岗位名称:系统安全需求分析师。 岗位职责:负责对目标对象需要达到的安全目标…...

数据库设计-范式

范式 范式就是数据库的构建规则,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF&#x…...

在前端开发中,何时应该使用 jQuery,何时应该使用 Vue.js

如果您是最近才开始进入 Web 前端开发领域的开发人员,那么您可能会听说过 jQuery。jQuery 是一个小巧而功能强大的 JavaScript 库,旨在简化跨浏览器 DOM 操作、事件处理、动画效果和 AJAX 等方面的操作,可以让开发人员更轻松地开发出高质量的…...

Promise类方法

这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个&am…...

transformer and DETR

RNN 很难并行化处理 Transformer 1、Input向量x1-x4分别乘上矩阵W得到embedding向量a1-a4。 2、向量a1-a4分别乘上Wq、Wk、Wv得到不同的qi、ki、vi(i{1,2,3,4})。 3、使用q1对每个k(ki)做attention得到a1,i(i{1,2,3,4…...

数据结构(六)—— 二叉树(4)回溯

文章目录 一、题1 257 二叉树的所有路径1.1 写法11.2 写法2 一、题 1 257 二叉树的所有路径 1.1 写法1 递归回溯:回溯是递归的副产品,只要有递归就会有回溯 首先考虑深度优先搜索;而题目要求从根节点到叶子的路径,所以需要前序…...

JVM基础知识(一)

1.整体架构和组件 1.Class Loader Class Loader(类加载器)负责将.class文件加载到JVM中,并生成对应的Java类对象(Class对象)。Java中有三种类加载器: Bootstram ClassLoader:加载核心类库&…...

ASP.NET Core Web API用户身份验证

一、JWT介绍 ASP.NET Core Web API用户身份验证的方法有很多,本文只介绍JWT方法。JWT实现了服务端无状态,在分布式服务、会话一致性、单点登录等方面凸显优势,不占用服务端资源。简单来说,JWT的验证过程如下所示: &a…...

785. 快速排序

785. 快速排序 给定你一个长度为 n n n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n n n。 第二行包含 n n n 个整数(所有整数均在 1 ∼ 1 0 9 1 \th…...

C6678学习-IPC

文章目录 1、简介2、模块MultiProc静态设置(cfg设置)动态设置 IPCNotifyMessageQShareRegion 1、简介 IPC: Inter-Processor Communication 处理器间通信,指提供多处理器环境中的处理器之间的通信、相同处理器不同线程间的通信。包括数据传递…...

利用 Delte-Sigma ADC简化电路设计

很多时候在电路中选择合适的 ADC可以很大程度上简化前端的电路。这里我们一起来看一个电阻电桥的例子: 这里用到了一只仪表放大器和一只运算放大器,他们实际上主要完成了三个功能: 1. 抑制了 2.5V的共模信号; 2. 将-1…...

如何在 Windows 11 启用 Hyper-V

准备在本机玩一下k8s,需要先启用 Hyper-V,谁知道这一打开,没有 Hyper-V选项: 1、查看功能截图: 2、以下文件保存记事本,然后重命名为*.bat pushd "%~dp0" dir /b %SystemRoot%\servicing\Packa…...

哈希表企业应用-DNA的字符串检测

DNA的字符串检测-引言 若干年后, ikun DNA 检测部成立,专门对 这些ikun的解析检测 突然发现已经完全控制不了 因为学生已经会了 而且是太会了 所以DNA采用 以下视频测试: ikun必进曲 ikun必经曲 ikun必阶曲 如何感受到了吧!,如果你现在唱跳并且还Rap 还有打篮球 还有铁山靠 那…...

Kafka运维与监控

Kafka运维与监控 Kafka运维与监控一、简介二、运维1.安装和部署安装部署 2.优化参数配置配置文件高级配置分区和副本设置分区数量设置副本数量设置 网络参数调优传输机制设置连接数和缓冲区大小设置 消息压缩和传输设置消息压缩设置消息传输设置 磁盘设置和文件系统分区磁盘容量…...

【Redis—哨兵机制】

文章目录 概念哨兵机制如何工作的监控(如何判断主节点真的故障了)哪个哨兵进行主从故障转移?故障转移流程哨兵集群 概念 当进行主从复制时,如果主节点挂掉了,那么没有主节点来服务客户端的写操作请求了,也…...

MySQL学习笔记第七天

第07章单行函数 2. 数值函数 2.4 指数函数、对数函数 函数用法POW(x,y)&#xff0c;POWER(X,Y)返回x的y次方EXP(X)返回e的x次方&#xff0c;其中e是一个常数&#xff0c;2.718281828459045LN(X)&#xff0c;LOG(X)返回以e为底的X的对数&#xff0c;当x<0时&#xff0c;返…...

中级软件设计师备考---程序设计语言和法律法规知识

目录 需要掌握的程序语言特点法律法规知识---保护期限法律法规知识---知识产权人确定法律法规知识---侵权判定标准化基础知识 需要掌握的程序语言特点 Fortran语言&#xff1a;科学计算、执行效率高Pascal语言&#xff1a;为教学而开发的、表达能力强&#xff0c;演化出了Delp…...

Leetcode434. 字符串中的单词数

Every day a leetcode 题目来源&#xff1a;434. 字符串中的单词数 解法1&#xff1a;istringstream 我们知道&#xff0c;C默认通过空格&#xff08;或回车&#xff09;来分割字符串输入&#xff0c;即区分不同的字符串输入。 istringstream类用于执行C风格的串流的输入操…...

C++ cmake工程引入qt6和Quick 教程

目录标题 前言QML简介锻炼C水平 cmake修改方法方式一&#xff08;qt6_add_resources&#xff09;方式二 (qt_add_qml_module ) 其他相关知识为什么会有_other_files&#xff1f;qt_standard_project_setup() 函数qt_add_qml_module() 和 qt6_add_resources()的方式差异const QU…...

JavaEE - 网络编程

一、网络编程基础 为什么需要网络编程&#xff1f; 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。 相比本…...

天津网站建设zmad/最近最新的新闻

现在微信已经关闭了QQ号和邮箱注册的功能&#xff0c;那如何才能用邮箱登陆微信呢&#xff1f;下面小编以TOM邮箱为例&#xff0c;分享一下邮箱登录微信的具体操作~ 1、打开微信&#xff0c;点击注册&#xff0c;默认为手机号注册。输入手机号注册一个账号&#xff08;只用手机…...

建立一个网站平台需要多少钱/东莞seo外包平台

转自&#xff1a;https://www.jizhuba.com/zhichanglicai/20180119/5705.html 方法/步骤1、例如我们想删除桌面上的“123”文件夹&#xff0c;发现无法删除。2、可以这样解决&#xff1a;3、在任务栏上右击&#xff0c;然后选择“任务管理器”。4、打开“任务管理器”&#xff…...

网站建设客户告知书/推广普通话内容100字

test voice port 0/0/1 relay ring on 测试线路 csim start 1002 隐藏命令&#xff0c;用来测试路由 show voice port summary 查看端口 show dial-peer voice summary 查看路由 传统pots精准号码会被吃号 no digit-strip forward-digits all prefix 1001 配置T302需要在连…...

金泉网做网站多少钱/制作网站的步骤是什么

一、xml布局&#xff0c;定义一个按钮(点击获取)和一个ImageView用来装图片xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingBottom"dimen/activity_…...

网站做视频的软件叫什么/杭州网站seo价格

void doFun(){}; var timer new DispatcherTimer { Interval TimeSpan.FromSeconds(2) }; timer.Start();timer.Tick (sender2, args) >{timer.Stop();doFun();};...

网页微博怎么用qq登录/太原百度网站快速优化

JavaScript中本地对象、内置对象和宿主对象 1、本地对象 ECMA-262 把本地对象&#xff08;native object&#xff09;定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。 再来看一下&#xff0c;“本地对象”包含哪些内容&#xff1a; Object、Function、Array、String、…...