ORACLE Redo Log Buffer 重做日志缓冲区机制的设计

news2024/11/29 0:45:58

最近和朋友包括一些国产数据库的研发人员交流,很多程序员认为 Oracle 已经过时,开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。

在这里插入图片描述

实际上数据库系统的发展是一个动态的过程,通常需要与用户和应用场景的实际需求相适应。这就是为什么大多数成功的通用数据库系统都经历了长期多个版本和演化阶段,在不断地改进和完善以满足不断变化的用户和应用场景的需求。

为什么很多朋友和客户都觉得 Oracle 数据库的内部设计非常复杂,那是因为很多应用场景如果你从没碰到过,你都完全想象不出来,更不可能靠几个研发人员能提前设计出来,而是 Oracle 在四十多年的实践过程中被各种各样的用户需求和应用场景不断打磨出来的。

虽然中国在部分关键科技领域取得了革命性的突破,但是美国仍然保持着全局性和关键性的优势。

实际上大型通用数据库之所以成为卡脖子的核心技术之一,就是因为数据库在中国信息技术基础设施和各行各业中扮演着关键数据存储和查询修改的核心角色,数据库系统的处理性能、可用性和可扩展性对整个国家和社会的健康运行和正常运转具有非常重要的影响,主要体现在:

在这里插入图片描述

  1. 数据量持续增长:随着时间的推移,政府、企业和组织的数据量正在不断加速增长。这包括政府机关政务系统的核心处理数据,电力、民航、高铁、船舶、车辆交通运输控制系统数据,银行、保险、证券、金融交易数据,国家安全、警务、司法系统数据,财政、民政、税务、安监系统数据、广电、卫星、通信、卫生、疾控、医院部门核心系统数据,企业自动化生产、仓储、物流系统数据等等。

    数据库必须能够有效地管理和存储这些庞大的数据集。如果数据库无法及时有效地处理这么多种类大规模数据的增删查改,轻则导致交通、生产事故和人身伤亡事故,重则危及社会基础设施运行和国家安全。

  2. 复杂查询需求:许多核心业务应用需要执行复杂的数据库查询,如连接多个表、聚合数据、执行复杂的过滤和排序。如果数据库查询引擎不足够高效或者数据库设计不合理,查询性能将受到影响,成为瓶颈。

  3. 高并发访问:政府、企业、组织的核心应用程序通常需要支持大量并发用户。例如,12306订票网站、社保网站、税务网站、电子商务网站、社交媒体平台在高峰期都面临着数以千万计甚至上亿计的用户同时访问数据库的挑战。数据库必须能够有效地处理并发访问请求,否则会导致性能卡顿或应用崩溃。

  4. 事务处理要求:数据库是事务性应用的核心。金融交易、交通指挥、库存管理、订单处理等领域的应用程序要求数据库保证事务的完整性和一致性。如果数据库无法有效地处理事务,可能导致数据错误和不一致。

  5. 数据安全性和合规性:数据安全性和合规性要求对数据库进行适当的保护和审计。加密、访问控制、审计功能等都需要在数据库中得到支持。如果数据库无法提供足够的安全性和合规性,可能会面临数据泄露和法律问题。

  6. 备份和恢复:数据库的备份和恢复是关键的数据管理任务。如果没有有效的备份和恢复策略,数据库出现故障时可能会导致数据丢失或错误,以至于应用程序长时间的宕机。

  7. 数据库设计和索引优化:数据库的设计和索引优化对于性能至关重要。不合理的数据库设计、缺乏索引或不正确的索引选择都可能导致性能问题。

  8. 新技术的应用:随着新技术的不断涌现,适配的数据库系统需要不断适应并集成这些新技术,在提供更好的性能和功能的同时满足稳定性和可靠性。

  9. 业务需求的变化:政府、企业、组织的业务需求和应用场景一直在不断变化。数据库系统必须能够灵活地适应这些新的需求和变化,灵活做出调整,否则可能会出现应用崩溃或者满足不了新的功能。

综上所述,数据库成为卡脖子技术的原因多种多样,通常是由于复杂的需求、大规模的数据、高并发访问、性能限制以及不足的数据库管理和优化策略等因素的综合影响。解决这些问题需要综合考虑数据库设计、硬件和软件配置、性能优化、容错和灾难恢复等多个方面,以确保数据库能够满足整个国家和社会不断发展的需求,是一件难度非常之大的事情,不是靠人多力量大就能解决的。

在当前环境下,多学习成熟的 Oracle 是国产数据库发展的一条捷径,Oracle 四十多年在全球多个国家和企业的大规模应用所获得的经验是十分值得我们现阶段去学习的。

今天我们来看看ORACLE Redo Log Buffer 重做日志缓冲区机制的设计。

重做日志缓冲区(Redo Log Buffer)虽然是Oracle数据库SGA(System Global Area)中最小的一个内存结构,但却是一个非常关键的组件,其结构和用途都非常重要。

它的主要功能是记录用户进程执行的SQL语句对数据库内存块缓冲区的数据所做的更改操作,这些更改被称为重做日志条目。

在需要数据库恢复的情况下,这些条目包含了重建由INSERT、UPDATE、DELETE、CREATE、DROP或ALTER等操作所做的更改所需的多组信息。

重做日志缓冲区是一个循环使用的内存缓冲区,当它写满时,新的重做日志条目将从缓冲区的起始位置开始写入,覆盖旧的数据。

在Oracle数据库中,重做日志条目(Redo Log Entries)是由用户进程生成的,

用户进程包括了执行SQL语句的进程,如执行INSERT、UPDATE、DELETE等数据操作语句的会话。

当用户进程执行这些SQL语句时,它们会生成相应的重做日志条目,这些条目记录了执行的数据操作、事务信息等。

用户进程生成的重做日志条目用于保证数据的一致性和持久性。

当用户进程生成重做日志条目后,它们首先被存储在重做日志缓冲区中,然后由LGWR(Log Writer)进程负责将重做日志缓冲区中的数据定期写入磁盘上的联机重做日志组(Online Redo Log),这个过程确保了操作事务过程中数据的持久性和一致性,即使数据库发生故障,也可以通过重做日志文件来恢复数据。

LGWR 按顺序将数据块写入磁盘,而 DBWR 则将数据块分散写入磁盘。分散写入往往比顺序写入慢得多。由于 LGWR 使用户能够避免等待 DBWR 完成其缓慢写入,因此数据库通过这种设计提供了更高效的处理性能。

为了更清晰地理解用户在修改一行数据时数据库对 Redo Log 相关的一系列操作,我们来看下一步步的过程分析:

Redo Log Buffer

  1. 用户端发出一条更新的SQL语句,这个SQL语句通常是某个事务的一部分,并且Oracle为该事务分配了唯一的事务号。

  2. 服务器进程负责执行这个SQL语句。在执行之前,服务器进程需要将需要的数据、索引以及还原数据读入内存,并锁定将要更新的行。

  3. 在执行更新操作之前,服务器进程会尝试获得一个重做复制闩锁(Redo Copy Latch)。这个闩锁的作用是确保对重做日志缓冲区的串行访问,以避免多个服务器进程同时更改数据,可能会发生的数据争用,并且导致性能的降低。如果没有空余的闩锁(Latch)可用,其他服务器进程将无法访问重做日志缓冲区,直到 Redo Log Buffer 写入完成,释放闩锁。

在这里插入图片描述

可以按如下方式查看系统的 Redo Copy Latch 当前状态。

SQL> col name for a13;
SQL> select name, gets, misses, immediate_gets, wait_time
  2  from v$latch_children
  3  where name='redo copy';

查询重做复制闩锁

  1. 一旦获得了重做复制闩锁(Redo Copy Latch),服务器进程会再次尝试获得一个重做分配闩锁(Redo Allocation Latch),这个闩锁用于获取重做日志缓冲区中的预留空间,以便写入重做日志条目。一旦获取了重做分配闩锁并成功分配了重做日志缓冲区中的空间后,它会立即释放这个闩锁。

“Redo Allocation Latch”(重做分配闩锁)是Oracle数据库中的一种内部锁机制,用于协调和管理对重做日志缓冲区的分配操作。这个锁的主要作用是确保多个服务器进程(user processes)在向重做日志缓冲区写入新的重做日志条目时能够互斥地分配和使用缓冲区中的空间,以避免数据竞争和混乱。

具体来说,当一个服务器进程需要在重做日志缓冲区中分配一定的空间来存储新的重做日志条目时,它会尝试获取"Redo Allocation Latch",以获得分配的控制权。一旦成功获取了这个锁,服务器进程就可以安全地将新的重做日志条目写入缓冲区,并确保不会与其他进程的操作冲突。

重要的是,一旦分配操作完成,服务器进程通常会立即释放"Redo Allocation Latch",以便其他进程也可以获取并使用重做日志缓冲区中的空间。这种机制允许多个并发进程在数据库中进行写操作,同时维护了数据的一致性和完整性。

“Redo Allocation Latch”(重做分配闩锁)可以通过以下方式查看:

SQL> select count(*) from v$latch_children where name='redo allocation';

查询重做分配闩锁

  1. 接下来,服务器进程使用获得的重做复制闩锁,将重做项写入重做日志缓冲区。重做项包括了更新数据的原始值、操作类型、事务号等信息。完成写入后,服务器进程释放重做日志复制闩锁。

  2. 与此同时,服务器进程还会将还原信息写入与该事务相关的还原段。这个还原段在用户使用ROLLBACK指令进行回滚操作时会被使用。

  3. 最后,服务器进程完成对数据的更新,将需要的原始值和对数据所做的修改写入数据库高速缓冲区。这些数据被标记为脏数据,因为此时内存中的数据与磁盘中的数据不一致了。

在理解了重做日志缓冲区的工作原理和上述过程后,我们可以进一步分析LGWR(Log Writer)进程何时将重做日志缓冲区中的重做数据写入重做日志文件。

深刻理解这些操作对于优化重做日志缓冲区的性能非常重要。

LGWR 进程会在以下任何一种情况发生时把缓冲区数据刷新(Flush)写入磁盘:

  • 1、每3秒钟一次;
  • 2、发生提交(COMMIT)或者回滚(ROLLBACK)请求时;
  • 3、要求LGWR切换日志文件(Redo Log File)时;(alter system switch logfile;)
  • 4、重做缓冲区(Redo_Log_Buffer)用满1/3,或者缓存重做日志数据达到 1MB 时;

由于上面的这些原因,如果重做日志缓冲区的大小超过几十MB,对大部分系统来说就没什么意义了。

除非是一个拥有大量并发事务的大型系统,或许较大的重做日志缓冲区才会对它有利,因为LGWR这个负责将重做日志缓冲区刷新输出到磁盘的进程,在将日志从缓冲区输出到磁盘时,其他会话也可能需要同时向缓冲区中填入新的数据。

一般而言,如果有一个事务长时间运行并生成大量重做日志,这种情况下采用大于常规的日志缓冲区是有好处的,因为在LGWR 将重做日志缓冲区里的数据刷新输出到磁盘的同时,这种长事务也会不断地向缓冲区里写入数据。事务越大、越长,大日志缓冲区的好处就越显著。

重做日志缓冲区的默认大小由 LOG_BUFFER 参数控制,并随不同操作系统、数据库版本和其他参数设置会有很大变化。

可以通过以下语句查询当前数据库 LOG_BUFFER 配置的大小约为 7MB 左右。(SGA为 8GB )。

SQL> show parameter log_buffer

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
log_buffer			     big integer 7312K

或者查询 SGA

SQL> SHOW SGA

Total System Global Area 8589930576 bytes
Fixed Size		    8945744 bytes
Variable Size		 1476395008 bytes
Database Buffers	 7096762368 bytes
Redo Buffers		    7827456 bytes  		//  LOG_BUFFER当前配置

当LGWR(Log Writer)将重做日志缓冲区中的重做条目写入重做日志文件或磁盘时,用户进程可以继续在内存中写入磁盘的条目上复制新的重做条目。这是因为在Oracle的重做日志机制中,重做日志缓冲区是一个循环的结构,新的重做条目可能会覆盖已经安全写入磁盘的较旧条目。

这个机制确保了内存中的重做日志缓冲区保持了最新的更改。即使在LGWR将条目写入磁盘的同时,用户进程生成的新的重做条目也有可能覆盖已经写入磁盘的旧条目。

重做日志缓冲区”的说明

这种设计保证了数据库在需要恢复时,可以使用重做日志文件重新应用用户进程最近的更改。

LGWR(Log Writer)的主要任务之一是确保重做日志缓冲区中始终有足够的空间来容纳新生成的重做条目,即使这个缓冲区经常被访问。如果重做日志缓冲区的空间不足,LGWR会在需要时将重做日志条目写入磁盘,以释放空间供新的条目写入。这种情况下,LGWR会不断地将重做记录刷新到磁盘,以确保缓冲区保持足够的空间。

数据库初始化参数 Log_Buffer 定义了重做日志缓冲区的大小,默认值是 DB_BLOCK_SIZE 的四倍。通常,较大的 Log_Buffer 值会减少重做日志文件 I/O,尤其是在事务较长或事务数多的情况下。

在高事务负载的生产数据库中有一个重要的优化策略是增加重做日志缓冲区的大小(Log_Buffer 的值设置得足够大)。如果重做日志缓冲区足够大,那么它更有可能在不频繁刷新到磁盘的情况下容纳新的重做记录。这不仅提高了性能,还减少了频繁的重做日志文件I/O操作,因为写入磁盘通常比写入内存更耗时。

重做日志组是循环使用的,当前的重做日志文件已满并覆盖以前的文件时,如果数据库处于归档模式,归档进程(ARCH)会自动将被覆盖的重做日志文件的内容复制到归档日志文件中。

要优化数据库性能,需要考虑以下几个因素:

1. 适当设置 Log_Buffer 参数的大小,以减少重做日志文件I/O操作,特别是在高事务负载情况下。
2. 确保重做日志文件的大小和数量足够,以容纳数据库的活动,避免频繁的重做日志切换。
3. 监控数据库的性能指标,如等待事件,特别是与重做相关的性能问题,如"log buffer space"等待事件,以及通过适当的配置来解决这些问题。

还有一种优化方法就是启用"私有重做并行模式"(Private Redo Parallelism)或"零拷贝重做"(Zero Copy Redo)功能。

通过启用Oracle数据库内部参数 "_LOG_PRIVATE_PARALLELSIM"参数控制数据库引擎启用或禁用零拷贝重做优化功能。当该参数被设置为TRUE时,数据库引擎会尝试使用零拷贝技术来提高重做日志操作的性能。
"零拷贝重做"

零拷贝重做优化功能可以将Shared Pool分割为多个部分,为每个服务器进程创建一个独立的专用空间,并在每个专用空间创建重做更改向量(Redo Change Vector)的数据结构,用于存储每个服务器进程重做日志的更改。

然后,LGWR进程可以直接将这个**重做更改向量(Redo Change Vector)写入磁盘上的重做日志文件,而无需将它复制到重做日志缓冲区。**这种优化可以提高性能并减少不必要的资源开销。

然而,“零拷贝重做”(Zero Copy Redo)功能的实际可行性取决于每个数据库的特定的运行环境和实际生产需求。在考虑应用这些策略时,需要仔细评估数据库的工作负载、硬件资源和数据库管理员的经验,并在非生产环境中进行详细地测试和评估,以确保它们对数据库的性能产生正面影响而不会引入不必要的风险。

重做日志缓冲区在Oracle数据库中扮演着关键的角色,用于记录和保护数据更改,同时也需要仔细配置和监视以确保数据库的高性能和可靠性。理解它的结构和用途对于数据库管理和性能优化至关重要。

在这里插入图片描述
最后想说,在基础核心软件研发领域,绝对不能孤立自己,关起门来造轮子,往往是自嗨,除了感动自己,更多的是走错了方向,方向错了,越努力只会离目标越远。如果不积极与其他国家的研发者交流合作,眼界通常受限,思维容易僵化。

在数据库领域,虚心请教和学习发达国家的成熟软件是非常关键的一部分。尤其是要借鉴欧美国家在软件领域的先进经验。这些国家在软件研发方面拥有丰富的经验和资源,他们的方法、技术、产品常常是业界的佼佼者。因此,与他们保持联系,向他们请教、学习他们的最佳实践,可以帮助我们在核心软件研发中不断进步。

与欧美国家的专家和团队保持合作关系,参与国际性的开源项目或国际标准制定,也是一种增长见识、提升软件开发水平的有效途径。通过与他们共同工作,可以深入了解国际软件领域的最新趋势和发展方向,从而更好地满足国内用户和市场的需求。

总之,基础核心软件研发需要开放的思维和广泛的合作。与他人共同学习、探讨问题,特别是借鉴欧美国家的先进经验,将有助于提高我们的软件研发水平,最终解决“卡脖子”的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1055414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Alibaba Nacos 配置中心 (配置持久化与动态刷新) 实战

文章目录 一、配置持久化到DB1. 找到配置文件2. 修改配置文件3. 执行数据库SQL4. 控制台创建配置文件 二、集成Nacos配置中心客户端1. 引入依赖2. 添加配置信息3. 创建配置信息4. 编写测试类5. 运行测试6. 动态刷新配置 一、配置持久化到DB 1. 找到配置文件 找到 nacos 的安装…

C#,数值计算——Ranlim32的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// High-quality random generator using only 32-bit arithmetic.Same conventions /// as Ran.Period is 3.11E37 . Recommended only when 64-bit arithmetic is not /// a…

中国1km土壤特征数据集(2010年)

简介&#xff1a; 中国1km土壤特征数据集&#xff08;2010&#xff09;是基于第二次全国土壤调查的中国1:1000000比例尺土壤图和8595个土壤剖面图&#xff0c;以及美国农业部&#xff08;USDA&#xff09;中国区域土地和气候模拟标准&#xff0c;开发了一个多层土壤粒度分布数…

开源layui前端框架 收款码生成系统源码 多合一收款码生成源码 带50多套UI模板

Layui前端的多合一收款码在线生成系统源码_附多套前端UI模板。 卡特三合一收款码生成系统源码&#xff0c;和收款啦采用一样的原理。 内部多达50多套模板&#xff0c;前端跟付款界面都特别好看。 识别收款码之后会自动加密&#xff0c;非常安全。 一样没有后台&#xff0c;一样…

2023年全球接口IP市场发展趋势分析:市占率第二IP品类,受大数据及计算需求推动高速增长[图]

接口IP是基于标准接口协议&#xff0c;实现芯片与内外部设备进行通信、传输数据的电路模块&#xff0c;分为有线接口IP与无线接口IP&#xff0c;主要用于数字信号处理和嵌入式系统中的接口设计。 接口IP分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; …

深度学习:基于长短时记忆网络LSTM实现情感分析

目录 1 LSTM网络介绍 1.1 LSTM概述 1.2 LSTM网络结构 1.3 LSTM门机制 1.4 双向LSTM 2 Pytorch LSTM输入输出 2.1 LSTM参数 2.2 LSTM输入 2.3 LSTM输出 2.4 隐藏层状态初始化 3 基于LSTM实现情感分析 3.1 情感分析介绍 3.2 数据集介绍 3.3 基于pytorch的代码实现 3…

在Windows11家庭中文版中启用Copilot(预览版)

1、下载ViveTool-vx.x.x.zip 2、解压下载的压缩包ViveTool-vx.x.x.zip 3、复制ViveTool文件夹的路径 4、按下wins&#xff0c;打开搜索 5、输入cmd&#xff0c;并选择“以管理员身份运行” 6、在cmd中输入以下命令&#xff0c;进入ViveTool文件夹&#xff1a; cd ViveTool…

【最新版配置conda环境】新版pycharm导入新版anaconda环境

最近下载了新版pycharm和新版anaconda&#xff0c;并且在命令行创建了环境&#xff0c;想着在pycharm里面导入环境。结果现在的导入方式发生了变化。 之前是通过导入Python.exe进行的。 现在&#xff1a; 当我们点击进去之后&#xff0c;会发现找不到python.exe了。 具体什么…

网络安全复习大纲wcf

单选10判断10填空30简答25分析25 选择 &#xff08;1&#xff09;计算机网络安全是指利用计算机网络管理控制和技术措施&#xff0c;保证在网络环境中数据的&#xff08; &#xff09;、完整性、网络服务可用性和可审查性受到保护。 A、保密性 B、抗攻击性 C、网络服务管理性 …

mysql服务器时间(时区问题)

本地能查询出来数据&#xff0c;而服务端查询不出来 这是sql代码 在studentId没问题的情况我首先怀疑的就是NOW&#xff08;&#xff09;获取的时间出了问题&#xff0c;后来我想到我的数据库是上海的&#xff0c;时间应该没问题啊&#xff0c;百思不得其解。date去查了系统的…

如何将超大文件压缩到最小

1、一个文件目录&#xff0c;查看属性发现这个文件达到了2.50GB&#xff1b; 2、右键此目录选择添加到压缩文件&#xff1b; 3、在弹出的窗口中将压缩文件格式选择为RAR4&#xff0c;压缩方式选择为最好&#xff0c;选择字典大小最大&#xff0c;勾选压缩选项中的创建固实压缩&…

svn下载安装与使用教程/方法

1、官网下载SVN服务器 官网网址&#xff1a;Subversion Server for Windows | VisualSVN Server 本地新建空文件夹 桌面右击选择如下图所示&#xff1a; 填入刚刚拷贝的仓库地址&#xff0c;与所建立文件要放得地方&#xff0c;点击ok即可。 2、提交代码 新建文件&#xf…

正则表达式基本使用

文章目录 1. 基本介绍2. 元字符(Metacharacter)-转义号 \\3. 元字符-字符匹配符3.1 案例 4. 元字符-选择匹配符5. 元字符-限定符6. 元字符-定位符7. 分组7.1 捕获分组7.2 非捕获分组 8. 非贪婪匹配9. 应用实例10. 正则验证复杂URL 1. 基本介绍 如果要想灵活的运用正则表达式&a…

【计算机取证篇】Windows禁用驱动程序签名教程

【计算机取证篇】Windows禁用驱动程序签名教程 高级启动—【蘇小沐】 文章目录 【计算机取证篇】Windows禁用驱动程序签名教程1、实验环境 &#xff08;一&#xff09;驱动问题&#xff1a;驱动安装失败&#xff08;二&#xff09;高级启动&#xff1a;F7禁用驱动程序强制签名…

2023年9月随笔之摩托车驾考

1. 回头看 日更坚持了273天。 读《SQL学习指南&#xff08;第3版&#xff09;》更新完成 读《高性能MySQL&#xff08;第4版&#xff09;》持续更新 学信息系统项目管理师第4版系列持续更新 9月码字81307字&#xff0c;日均码字数2710字&#xff0c;累计码字451704字&…

基于Java的二手交易系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了

找到IIS管理器启动程序的所在位置 并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性&#xff0c;找到其位置 管理员模式打开cmd命令行&#xff0c;并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因&#xff1a;由于某…

图神经网络GNN(一)GraphEmbedding

DeepWalk 使用随机游走采样得到每个结点x的上下文信息&#xff0c;记作Context(x)。 SkipGram优化的目标函数&#xff1a;P(Context(x)|x;θ) θ argmax P(Context(x)|x;θ) DeepWalk这种GraphEmbedding方法是一种无监督方法&#xff0c;个人理解有点类似生成模型的Encoder过程…

【多线程初阶】多线程案例之线程池

文章目录 前言1. 什么是线程池1.1 线程池的优势 2. 标准库中的线程池2.1 聊聊工厂模式2.2 Executors 创建线程池的几种方式2.3 ThreadPoolExecutor 构造方法中的几个参数2.3.1 RejectedExecutionHandler handler 的几个拒绝策略 3. 自己实现一个线程池总结 前言 本文主要给大家…

【COMP304 LEC3】

LEC 3 1. Contingent Formulas&#xff1a; 定义&#xff1a;Truth or falsity of a propositional formula depends on the truth/falsity of the atoms in the formula 例子&#xff1a;p ∧ q is true if both p and q are true, false otherwise.这里p和q就是atoms&…