乐观锁和悲观锁详解如果将悲观锁(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 库。不 ...
一、什么是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 ...
在我们编程过程中,经常会出现一种情况,就是现有的代码没办法直接使用,需要做一些适当的变换,来适配原有的程序,所以叫做适配器模式,或者包装器模式。
1.1 定义Print接口接口定义两个抽象方法输出字符串
1234public interface Print { abstract public void PrintWeak(); abstract public void PrintStrong();}
1.2 定义Banner类此类定义要打印的字符串及其构造方法, 定义了两个函数打印不同的字符串
123456789101112131415public class Banner { private String name; public Banner(String name) { this.name = name; } public void showWithParen() { System.out.println("(" + name + &q ...
模板方式设计模式在父类中编写了算法,就无需再在各个子类中编写同样的算法,如果程序出现BUG就会很快锁定
1.1 首先创建抽象父类AbstractDisplay父类中定义了三个方法,用于输出字符串
12345678910111213public abstract class AbstractDisplay { public abstract void open(); public abstract void print(); public abstract void close(); public final void display() { open(); for (int i = 0; i < 5; i++) { print(); } close(); }}
1.2 创建子类CharDisplay使子类继承AbstractDisplay类,重写父类的三个抽象方法
重写的方法将以特定的格式输出字符串
123456 ...
在工厂模式中,父类决定实例生成的具体方式,但是决定不了具体生成的类,具体的处理全部交给子类负责,类似于模板模式。
1.1 定义Product抽象类Product类来表示产品,这个类中只声明了抽象方法use()等待子类重写。
12345678/** * @author ikun * @date 2024年06月28日 14:35 */public abstract class Product { public abstract void use();}
1.2 定义Factory抽象类Factory类使用了模板模式,本类定义了抽象方法 creatProduct 和 registerProduct,定义并实现了 create 方法,通过调用这个方法实现产品的注册。
12345678910111213141516/** * @author ikun * @date 2024年06月28日 14:50 */public abstract class Factory { public Product create(String owner) & ...
程序在运行时,通常会创建很多实例,但是有时候只需要一个实例。那么我们可以用单例模式来解决这个问题。
单例模式也分为饿汉式和懒汉式;
下面是饿汉式的例子;
1.1 定义一个Singleton类,它的构造函数是private的,也就是说不能在Singleton类外部创建实例。12345678910111213141516/** * @author ikun * @date 2024年06月23日 23:35 */public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { System.out.println("生成了一个实例..."); } public static Singleton getInstance() { return singleton; }}
为了方便测试,在构造函数里打印语句,每调用一次就 ...