java中log使用总结

news2025/1/25 4:32:16

目录

  • 一、概述
    • 1.1. 核心日志框架
    • 1.2 门面日志框架
  • 二、最佳实践
    • 2.1 核心日志框架API包
    • 2.2 门面日志框架依赖
    • 2.3 集成使用
      • 2.3.1 集成jcl
      • 2.3.2 集成slf4j
        • 2.3.2.1 slf4j集成单一框架
        • 2.3.2.2 slf4j整合混合框架
  • 三、总结
    • 3.1 所有相关包
      • 3.1.1 核心日志框架包
      • 3.1.2 门面日志框架
      • 3.1.3 适配包
    • 3.2 依赖冲突解决总结

一、概述

本文乃博主呕心沥血之作,一文搞清楚java所有日志框架。阅读前请先收藏。

1.1. 核心日志框架

核心日志框架,就是实际干活的日志框架。总体而言,市面上的使用日志框架体系主要有

  1. jul(java.util.logging) jdk1.4加入,为了对抗log4j,效率灵活性较差使用较少
  2. log4j 最广泛应用的日志框架,成为事实上的标准
  3. logback 基于slf4j-api接口实现,性能高于log4j
  4. log4j2 重写了log4j,性能高于log4j,logback

1.2 门面日志框架

核心日志框架能单独使用,但多框架集成使用时使用会有冲突。所以出现了门面日志框架。

门面日志框架特征有:

  1. 提供统一日志使用接口,核心日志框架去实现门面日志框架的接口。
  2. 应用不使用具体的核心日志框架,只使用门面日志框架。不依赖核心日志框架,只依赖门面日志框架。
  3. 这样就算底层换核心框架依赖,不影响现有日志的使用。

目前主流的门面框架主要有JCL和SLF4J:

  1. JCL(commings-log) Apache提供的comming-log
  2. SLF4J(simple log facade for java) Log4j、Logback、Log4j2作者提供

二、最佳实践

2.1 核心日志框架API包

各核心日志框架单独使用的依赖,demo里的version不限制。

  • log4j
<!-- log4j的API包 -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

  • log4j2
<!-- log4j2的两个API包 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.9.1</version>
</dependency>

  • logback
        <!-- logback的两个API包-->
				<!-- logback无法单独使用,只能和slf4j集合使用-->
			  <!-- logback-classic实现了slf4j向logback的转换-->
			  <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
  • jul

jdk自带API,无依赖包


2.2 门面日志框架依赖

  • jcl
        <!-- jcl的API包 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>

  • slf4j
   <!-- slf4j的API -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>

2.3 集成使用

2.3.1 集成jcl

在这里插入图片描述

总结如下:

  1. JCL集成其他日志框架,只有log4j/jul没有中间包
  2. JCL同时集成其他核心日志框架,使用JCL打印日志优先级: log4j2>log4j>jul
  3. JCL同时和jul/log4j/log4j2集成,jcl没有全局整合能力各日志全部生效
  4. JCL同时和jul/log4j/log4j2集成,此时使用JCL打印日志生效的是log4j2
  5. slf4j转向JCL前提是没有slf4j的实现框架依赖,否则slf4j实现优先级更高

  • 集成jul

默认jcl就是集成jul的

        <!-- jcl的API包 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>

  • 集成log4j
        <!-- jcl的API包 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        <!-- log4j的API -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

  • 集成log4j2
        <!-- jcl的API包 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- log4j2的两个API包 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!-- 适配包:jcl转向log4j2  -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>2.9.1</version>
        </dependency>

  • 集成slf4j
			 <!-- slf4j的API包 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包:slf4j转向jcl -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jcl</artifactId>
            <version>1.7.25</version>
        </dependency>
			 <!-- JCL的实现包,可以为jul/log4j/logj42,这里省略。默认是jul -->

2.3.2 集成slf4j

2.3.2.1 slf4j集成单一框架

在这里插入图片描述

总结如下:

  1. SLF4J转向其他日志框架都需要对应适配包
  2. 其他日志框架经过JCL转向SLF4J时,一般可以省略JCL通过匹配包直接转向SLF4J不再展开
  3. SLF4J和具体日志框架的双向适配包不能同时存在(需排除冲突),否则会循环依赖栈溢出.包括:
    slf4j-jdk14和jul-to-slf4j(运行时直接栈溢出)
    slf4j-log4j12和log4j-over-slf4j(启动会检测报错)
    log4j-slf4j-impl和log4j-to-slf4j(运行时直接栈溢出)
    slf4j-jcl和jcl-over-slf4j(启动会检测报错)

  • 集成jul
   			<!-- slf4j的API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包:slf4j转向jul -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.7.25</version>
        </dependency>
				<!-- 适配包:jul转向slf4j -->
        <!-- 若和slf4j-jdk14包同时存在会造成jul和slf4j循环转化造成栈溢出,所以要排除 -->
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>jul-to-slf4j</artifactId>-->
<!--            <version>1.7.25</version>-->
<!--        </dependency>-->

  • 集成log4j
        <!-- log4j的API包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- slf4j的API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- log4j对slf4j的实现:log4j转slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包:log4j转向slf4j -->
        <!-- log4j-over-slf4j和slf4j-log4j12同时存在会循环依赖栈溢出,需要排除-->
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>log4j-over-slf4j</artifactId>-->
<!--            <version>1.7.25</version>-->
<!--        </dependency>-->

  • 集成log4j2
        <!-- log4j2的两个API包 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!-- slf4j的API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包: slf4j转向log4j2 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!-- 适配包: log4j2转向slf4j -->
        <!-- log4j-to-slf4j和log4j-slf4j-impl同时存在会循环依赖栈溢出,需要排除-->
<!--        <dependency>-->
<!--            <groupId>org.apache.logging.log4j</groupId>-->
<!--            <artifactId>log4j-to-slf4j</artifactId>-->
<!--            <version>2.9.1</version>-->
<!--        </dependency>-->

  • 集成logback
				<!-- slf4j的API包 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- logback的两个API包-->
        <!-- logback的Log相关API和包路径和slf4j一样,所以logback可以看作是slf4j的默认实现包-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

  • 集成JCL
        <!-- jul默认是JCL默认的实现包,也可以指定为log4j/log4j2 -->

				<!-- jcl的API包 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- slf4j的API包 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包: slf4j转向jcl -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jcl</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- jcl-over-slf4j和slf4j-jcl同时存在会循环依赖栈溢出,需要排除-->
        <!-- 适配包: jcl转向slf4j -->
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>jcl-over-slf4j</artifactId>-->
<!--            <version>1.7.25</version>-->
<!--        </dependency>-->

2.3.2.2 slf4j整合混合框架

slf4j获取具体框架的流程如下,可得知slf4j最终只能转向单个日志框架。

LoggerFactory.getLogger触发初始化
-> 根据classLoader查找org/slf4j/impl/StaticLoggerBinder.class,check不能有多个
-> 触发org.slf4j.impl.StaticLoggerBinder(不同集成框架路径相同实现不同)的getBean初始化
-> 报告StaticLoggerBinder的实际采用
-> slf4j版本检验
-> 根据StaticLoggerBinder获取org.slf4j.ILoggerFactory
-> 根据ILoggerFactory获取到org.slf4j.Logger


两个或以上的日志框架使用时,需要整合。达到以下目标:

  1. 全部日志API生效,能正常输出日志
  2. 排除冲突,避免循环转换栈溢出
  3. 排除冲突,避免slf4j转向实现框架

根据最终转向的日志框架分类:


  • 最终整合为jul
    在这里插入图片描述

  • 最终整合为log4j

在这里插入图片描述


  • 最终整合为log4j2

在这里插入图片描述


  • 最终整合为logback

在这里插入图片描述


三、总结

3.1 所有相关包

3.1.1 核心日志框架包

        <!-- log4j的API包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- log4j2的两个API包 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.9.1</version>
        </dependency>
				<!-- logback的两个API包-->
        <!-- logback的Log相关API和包路径和slf4j一样,所以logback可以看作是slf4j的默认实现包-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

3.1.2 门面日志框架

			<!-- slf4j的API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
			  <!-- jcl的API包 -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>

3.1.3 适配包

        <!-- 适配包:slf4j转向jul -->
        <!-- jul-to-slf4j和slf4j-jdk14包同时存在会造成jul和slf4j循环转化,所以要排除 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包:jul转向slf4j -->
        <!-- jul-to-slf4j和slf4j-jdk14包同时存在会造成jul和slf4j循环转化,所以要排除 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>

				<!-- 适配包:slf4j转向log4j -->
        <!-- log4j-over-slf4j和slf4j-log4j12同时存在会循环依赖栈溢出,需要排除-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- 适配包:log4j转向slf4j -->
        <!-- log4j-over-slf4j和slf4j-log4j12同时存在会循环依赖栈溢出,需要排除-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- 适配包: slf4j转向log4j2 -->
        <!-- log4j-to-slf4j和log4j-slf4j-impl同时存在会循环依赖栈溢出,需要排除-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!-- 适配包: log4j2转向slf4j -->
        <!-- log4j-to-slf4j和log4j-slf4j-impl同时存在会循环依赖栈溢出,需要排除-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
            <version>2.9.1</version>
        </dependency>

        <!-- 适配包: slf4j转向jcl -->
        <!-- jcl-over-slf4j和slf4j-jcl同时存在会循环依赖栈溢出,需要排除-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jcl</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- jcl-over-slf4j和slf4j-jcl同时存在会循环依赖栈溢出,需要排除-->
        <!-- 适配包: jcl转向slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- 适配包:jcl转向log4j2  -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>2.9.1</version>
        </dependency>

3.2 依赖冲突解决总结

  • 双向适配包循环依赖

slf4j-jdk14和jul-to-slf4j(运行时直接栈溢出)
slf4j-log4j12和log4j-over-slf4j(启动会检测报错)
log4j-slf4j-impl和log4j-to-slf4j(运行时直接栈溢出)
slf4j-jcl和jcl-over-slf4j(启动会检测报错)


  • slf4j单个实现类

使用slf4j整合其他框架时,只能转向单个日志框架,即class路径只能有一个org.slf4j.impl.StaticLoggerBinder

因此以下包不能同时使用,只能出现一个:

slf4j-jdk14

slf4j-log4j12

log4j-slf4j-impl

logback-classic

slf4j-jcl


  • 其他冲突

比如:

log4j.jar 低版本的和高版本冲突:目前测试下来:log4j1.2.6和1.2.17 两个jar同时引入导致日志不能打印


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

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

相关文章

Python元类(metaclass)

Python 是一种强大的编程语言&#xff0c;一部分得益于其语言设计中独特的元类&#xff08;Metaclass&#xff09;机制。尽管元类的概念在刚开始接触时可能会让人感到困惑&#xff0c;但一旦理解了它们的工作原理和应用方式&#xff0c;我们就可以用它们做出强大且灵活的抽象。…

无涯教程-JavaScript - COUPDAYS函数

描述 COUPDAYS函数返回包含结算日期的息票期限内的天数。 语法 COUPDAYS (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证券的到…

Nginx重写功能

Nginx重写功能 一、Nginx常见模块二、访问路由location2.1location常用正则表达式2.2、location的分类2.3、location常用的匹配规则2.4、location优先级排列说明2.5、location示例2.6、location优先级总结2.7、实例2.7.1、location/{}与location/{}2.7.2、location/index.html{…

joplin更新后找不到文章

Joplin的数据默认是存储在C:\Users\Username.config\joplin-desktop下的。我修改为了D:\joplinnotes 这样就导致在升级覆盖安装的时候&#xff0c;笔记丢失路径。如果记不起之前笔记保存在哪里&#xff0c;也可以搜索类似文件来回忆之前自己保存笔记的位置 cache\ plugins\ re…

黑马JVM总结(三)

&#xff08;1&#xff09;栈内存溢出 方法的递归调用&#xff0c;没有设置正确的结束条件&#xff0c;栈会有用完的一天&#xff0c;导致栈内存溢出 可以修改栈的大小&#xff1a; 再次运行&#xff1a;减少了次数 案例二&#xff1a; 两个类的循环应用问题&#xff0c;导致Js…

注解生效激活(idea)

File---------settings-----------Build,Execution,Deployment-----------Compiler------- Annotation Processors

数据分析和可视化平台:Splunk Enterprise for mac v9.1.1激活版 兼容m1

Splunk Enterprise 是一个数据分析和可视化平台&#xff0c;可帮助企业理解其数据。虽然没有适用于 Mac OS 的 Splunk Enterprise 官方版本&#xff0c;但他们确实为 Mac OS 提供了一个名为“Splunk Light”的应用程序&#xff0c;它提供了基本的数据索引、搜索和仪表板。或者&…

「网页开发|前端开发|Vue」07 前后端分离:如何在Vue中请求外部数据

本文主要介绍两种在Vue中访问外部API获取数据的方式&#xff0c;通过让Vue通过项目外部的接口来获取数据&#xff0c;而不是直接由项目本身进行数据库交互&#xff0c;可以实现前端代码和后端代码的分离&#xff0c;让两个部分的代码编写更独立高效。 文章目录 本系列前文传送…

SpringMVC的常用注解,参数传递以及页面跳转的使用

目录 slf4j 常用注解 RequestMapping RequestParam RequestBody PathVariable 参数传递 首先在pom.xml配置文件中导入SLF4J的依赖 基础类型String 复杂类型 RequestParam PathVariable RequestBody 增删改查 返回值 void返回值 String返回值 modelString …

“高效记录收支明细,按时间轻松查找借款信息“

我们有时候要去查找借款信息&#xff0c;只记得住借款记录的日期&#xff0c;想通过日期来进行筛选出借款信息&#xff0c;要如何进行操作&#xff1f;今天就让小编来教教大家要如何操作。 第一步&#xff0c;我们要打开【晨曦记账本】&#xff0c;并登录账本。 第二步&#x…

弃用http改用https的缘故,与密钥的使用,证书意义

为何弃用http协议 在十几年前&#xff0c;我们的传输协议是http协议&#xff0c;为何到了如今改成了https协议呢&#xff1f;为了安全的考虑。 在http协议中&#xff0c;我们的内容是透明的&#xff0c;不被保护的&#xff0c;在黑客等恶意分子的面前&#xff0c;信息极其任意…

百度输入法全面升级,打造首个基于大模型的输入法原生应用

基于文心一言&#xff0c;百度输入法宣布全面升级&#xff0c;打造行业首个“基于大模型的输入法原生应用”&#xff0c;从“输入工具”全面转型为“AI创作工具”。 近日&#xff0c;百度文心一言正式向公众开放。基于文心一言&#xff0c;百度输入法宣布全面升级&#xff0c;打…

Spring Data Rest远程命令执行漏洞复现(CVE-2017-8046)

一、漏洞说明 Spring Data Rest服务器在处理PATCH请求时存在一个远程代码执行漏洞。攻击者通过构造好的JSON数据来执行任意Java代码 二、影响版本 Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 Spring Boot version < 2.0.0M4 Spring Data release trains < K…

Python爬虫 教程:IP池的使用

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施&#xff0c;例如很多网站会检测某一段时间某个IP的访问次数&#xff0c;如果访问频率…

tcp满开始和拥塞避免

tcp的拥塞控制有四种算法&#xff0c;后面的快重传和快恢复是后面新增的&#xff0c; 刚开始会初始化慢开始门限值&#xff0c;并将拥塞窗口值为1往网络中发送&#xff0c;若收到确认包则将拥塞窗口翻倍&#xff0c;执行慢开始算法&#xff0c;当拥塞窗口值达到慢开始门限后&am…

关于测试的思考-自动化测试以及流量回放

二、自动化平台建设 线上问题 流量回放 一些流量回放比较好的实践

【F2 ...】

F2 -ThrombinGlaKRKRlightSP

人工智能轨道交通行业周刊-第59期(2023.9.4-9.10)

本期关键词&#xff1a;无锡智慧地铁、无人车站、钢轨打磨、混元大模型、开源大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界…

【JavaEE】线程安全

文章目录 1. 前言2. 线程安全的概念3. 造成线程不安全的原因4. 如何解决出现的线程不安全问题4.1 如何使用 synchronized 加锁&#xff1f;4.2 解决上面自增问题导致的线程安全问题 5. synchronized 的特性5.1 互斥性5.2 可重入性 6. 死锁6.1 什么情况下会造成死锁6.1.1 两个线…

[学习笔记]Node2Vec图神经网络论文精读

参考资料&#xff1a;https://www.bilibili.com/video/BV1BS4y1E7tf/?p12&spm_id_frompageDriver Node2vec简述 DeepWalk的缺点 用完全随机游走&#xff0c;训练节点嵌入向量&#xff0c;仅能反应相邻节点的社群相似信息&#xff0c;无法反映节点的功能角色相似信息。 …