Synchronized的实现原理 synchronized 是 Java 并发编程的基石,理解其底层原理对于编写高性能并发程序至关重要。 一、核心概念synchronized 实现原理依赖于 JVM 的 Monitor(监视器锁)和 对象头(Object Header)。当 synchronized 修饰在方法或代码块上时,会对特定的对象或类加锁,从而确保同一时刻只有一个线程能执行加锁的代码块。 1.1 synchronized 的三种使用方式 使用方式 锁对象 示例 修饰实例方法 当前实例对象 this public synchronized void method() 修饰静态方法 当前类的 Class 对象 public static synchronized void method() 修饰代码块 指定的锁对象 synchronized(lock) { } 底层字节码实现差异: 123456789101112// 1. synchronized 修饰方法public synchronized void syncMethod() ...
乐观锁和悲观锁详解如果将悲观锁(Pessimistic Lock)和乐观锁(PessimisticLock 或 OptimisticLock)对应到现实生活中来。悲观锁有点像是一位比较悲观(也可以说是未雨绸缪)的人,总是会假设最坏的情况,避免出现问题。乐观锁有点像是一位比较乐观的人,总是会假设最好的情况,在要出现问题之前快速解决问题。 什么是悲观锁?悲观锁总假设最坏的情况,认为共享资源每次被访问的时候都会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放,也就是说,共享资源每次只给一个线程使用,其他线程阻塞,用完之后再把资源转让给其他线程。 像Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的体现。 12345678910111213public void performSynchronisedTask() { synchronized (this) { // 需要同步的操作 }}private Lock l ...
前言最近一直在用 Sublime Text 3 开发项目,当找到一些解决方案的代码和日志并拷贝到Sublime Text 3时,总会遇到缩进和换行问题,此时复制的代码就显得杂乱无章的。开始选择在线代码格式化工具处理过再复制过来,慢慢用的多了,就想要能够在 Sublime Text 3 中直接可以格式化,以此来提升效率,于是引申出来本篇要介绍的内容。 1. 使用内置的格式化功能Sublime Text 3 自带了一些基本的格式化功能,适用于 HTML、CSS 和 JavaScript 等语言,我们可以通过如下操作来使用这些功能: 打开你想要格式化的文件 或者 选中你要格式化的代码片段; 选择菜单栏中的 Edit -> Line -> Reindent。 下面让我们来格式化一下 JavaScript 代码,如下动图: 2. 安装并使用第三方插件2.1 SublimeJsPrettierSublimeJsPrettier 是一个为 Sublime Text 开发的插件,它集成了 Prettier 的代码格式化功能。 Prettier 是一个流行的代码格式化工具,支持多种编 ...
日志是我们系统出现错误时,最快速有效的定位工具,没有日志给出的错误信息,遇到报错你就会一脸懵逼;而且日志还可以用来记录业务信息,比如记录用户执行的每个操作,不仅可以用于分析改进系统,同时在遇到非法操作时,也能很快找到凶手。 因此,对于程序员来说,日志记录是重要的基本功。 一、日志记录的方法日志框架选型有很多 Java 的日志框架和工具库,可以帮我们用一行代码快速完成日志记录。 在学习日志记录之前,很多同学应该是通过 System.out.println 输出信息来调试程序的,简单方便。 但是,System.out.println 存在很严重的问题! 首先,System.out.println 是一个同步方法,每次调用都会导致 I/O 操作,比较耗时,频繁使用甚至会严重影响应用程序的性能,所以不建议在生产环境使用。此外,它只能输出简单的信息到标准控制台,无法灵活设置日志级别、格式、输出位置等。 所以我们一般会选择专业的 Java 日志框架或工具库,比如经典的 Apache Log4j 和它的升级版 Log4j 2,还有 Spring Boot 默认集成的 Logback 库。不 ...
Spring Boot
未读一、什么是IP黑白名单?一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。 通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户的正常访问。 对于我们的需求,不让拉进黑名单的 IP 访问任何接口。 二、使用步骤1.通过Nacos添加配置访问Nacos后台,创建自己的配置 之后选择发布 2.pom.xml引入依赖12345678910 <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.12</version></dependency> <dependency> <groupId>cn.hutool</groupId&g ...
使用nginx部署发现的问题前端的vue3项目的代码打包后,部署到服务器上面,打开非index.html页面后后控制台报错如下: 查阅资料后发现,其实不是代码的问题,而是资源公共路径设置的问题,解决方法如下: 将vue.comfig.js中的 1publicPath 由"./" 改为 "/" 原因是新版vue3中在部署的时候已经不需要修改默认的路径了,不需要额外指定静态页面的路径。 另外,index.html 中引入的 jquery 文件在打包后,部署到服务器之后,也会报 Uncaught SyntaxError: Unexpected token ‘<’ 错误,解决办法很简单,把引入的 jquery 文件注释掉不要即可,如果项目确实需要使用 query ,最好也是用 npm 安装,而不是引入文件。
运维部署
未读上线步骤–后端1.配置服务器yum源1https://blog.csdn.net/weixin_49369665/article/details/143248527?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-143248527-blog-111396918.235^v43^control&spm=1001.2101.3001.4242.2&utm_relevant_index=4 12/etc/yum.repos.d/CentOS-Vault.repo在 CentOS-Vault.repo 添加如下配置,以启用 CentOS 7 的存档仓库,添加配置如下: 安装依赖 1sudo yum install -y yum-utils 添加 Docker 官方仓库: 1sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/dock ...
设计模式
未读适配器模式(Adapter Pattern) 适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口,使得原本不兼容的类可以协同工作。 一、模式概述1.1 定义适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 1.2 适用场景 想使用一个已存在的类,但其接口不符合需求 需要创建一个可复用的类,与不相关或不可预见的类协同工作 需要使用多个现有子类,但不可能对每个子类都进行适配 1.3 UML 类图12345678+----------+ +----------+ +---------+| Client | ----> | Target | <---- | Adapter | ----> | Adaptee |+----------+ +----------+ +---------+ +---------+ | +request()| | +request( ...
模板方法模式(Template Method Pattern) 模板方法模式是一种行为型设计模式,在父类中定义算法的骨架,将某些步骤延迟到子类中实现。 一、模式概述1.1 定义模板方法模式:在一个方法中定义算法的骨架,将某些步骤的实现延迟到子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。 1.2 适用场景 多个子类有共同的行为逻辑,只是某些步骤实现不同 需要控制子类扩展的范围 一次性实现算法的不变部分,可变部分留给子类 1.3 UML 类图123456789101112131415+------------------------+| AbstractDisplay | ← 抽象父类+------------------------+| + display(): void | ← 模板方法(final)| # open(): void | ← 抽象方法| # print(): void | ← 抽象方法 | # close(): void | ← 抽象方法+------- ...
工厂方法模式(Factory Method Pattern) 工厂方法模式是一种创建型设计模式,定义一个创建对象的接口,让子类决定实例化哪一个类。 一、模式概述1.1 定义工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 1.2 适用场景 当一个类不知道它所必须创建的对象的类时 当一个类希望由它的子类来指定它所创建的对象时 当类将创建对象的职责委托给多个帮助子类中的某一个时 1.3 UML 类图1234567891011121314+----------+ +----------+| Product | | Factory |+----------+ +----------+| +use() | | +create()|+----△-----+ | #createProduct()| | | #registerProduct()| | +-----△-----++----------+ ...










