自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 四、详解Redis集群

redis的数据一般保存在内存,那么当突然宕机,岂不是数据就丢失了,因此redis实现了将数据持久化的方式:RDB和AOF两种持久化方式。

2024-02-18 16:38:32 434

原创 三、详解Redis分布式锁&Redisson分布式锁

在传统的java进程中,我们常常用Synchronized或者ReentrantLock来对临界区进行加锁,防止多个线程之间并行访问,导致数据读写异常。但是这种锁的粒度仅限于当前jvm中,在工业生产环境下,往往一个web项目会部署多台机器,也就意味着会有多个jvm。那么这几个jvm是独立的,这就导致上述的锁失效。分布式锁是一种在分布式系统环境下,通过多个节点对共享资源进行访问控制的机制。

2024-01-23 11:42:31 1406

原创 二、redis的实践应用

我们常见的web网站或者app中,用户使用的第一步就是手机验证登录。1、输入手机号2、点击获取验证码3、点击登录那么这里在后端涉及两个操作,1:获取验证码,2:登录在获取验证码之后,那么手机号和验证码将一一绑定,然后返回给前端,当前端登录的时候,拿手机号和验证码进行验证。

2024-01-02 22:16:40 419

原创 一、Redis常用命令

String类型指的是redis中value类型为string。在redis中,有很多数据类型,不同的数据类型有不同的命令,除此之外还有一些通用命令,即针对所有类型的key都有效。setex key seconds value : 添加一个key,并设置其过期时间。​​​​​​​​​​​​​​setnx其实为 set if not exist。在底层,String类型都是通过char数组来存储的。当key不存在的时候,才添加,如果key存在则不操作。key不存在则添加,key存在则覆盖。

2024-01-02 12:36:40 405

原创 十、详解ReentrantReadWriteLock读写锁

之前我们讲过可重入锁从这篇博文中我们可以了解到,基于lock的锁底层都是利用aqs这个抽象类的。那么在读写锁中,其本质也是利用aqs,与可重入锁之间的区别的就是在实现抽象方法的时候,具体的逻辑不一样。可以理解为两者骨架一样,但是具体细节逻辑有区别,尤其是在tryAcquire和tryRelease的逻辑不一样。

2023-12-28 16:00:24 907 1

原创 九、详解线程池ThreadPool

有图可知,线程池的核心组成部分分别为:线程列表和阻塞队列。1、线程列表:这个很容易理解,就是一堆线程,用一个列表存储起来。每次都复用列表中的线程来执行任务,而不需要重新创建新的线程。2、阻塞队列:为什么需要一个阻塞队列呢,普通的队列行不行呢?之所以阻塞队列,主要的原因是平衡【放任务】和【拿任务】之间的速率。如果【放任务】的速度快,但是【拿任务】的速度慢,那么就需要一个队列来存储多余的任务。

2023-12-25 17:22:43 928

原创 八、详解CAS无锁

在之前的文章中,我们详细讲过了Synchronized和ReentrantLock的原理,以及他们如何实现线程安全的。但是在这两种方式种,都是在不满足条件的时候将当前线程阻塞,直到被另一个线程唤醒。这两种方式都需要切换线程上下文,而线程切换将消耗大量资源。jdk提供了一种无锁的方式来保证线程之间安全。即循环CAS。

2023-12-20 16:01:52 1340 1

原创 七、详解Volatile

volatile是Java提供的一种轻量级的同步机制,它主要有两个特性:保证变量的可见性和禁止指令重排序。1. 保证变量的可见性:在Java中,为了提高效率,每个线程都会有自己的工作内存(可以理解为CPU的高速缓存),线程对变量的所有操作都会在工作内存中进行,然后再同步回主内存。如果一个变量被volatile修饰,那么当一个线程修改了这个变量后,新的值会立即同步回主内存,当其他线程需要读取这个变量时,会直接从主内存中读取,而不是从工作内存,这样就保证了变量的可见性。

2023-12-19 20:13:18 802

原创 六、三种方式实现线程交替打印

要求:给定三个线程A,B,C。要求A,B,C三个线程一次打印a,b,c。

2023-12-19 17:56:16 460

原创 五、详解ReentrantLock

哲学家只有在拿到左右两边的筷子后才能吃面,吃完后再把筷子放下,继续思考。这个问题的关键在于,如果每位哲学家都先拿起自己左边的筷子,然后等待右边的筷子,那么就会出现死锁的情况,因为每位哲学家都在等待别人放下筷子,但是没有人会放下筷子。死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉,它们都将无法继续执行下去。2、尝试加锁:利用trylock的思想,先拿起一根筷子,然后尝试拿下一个筷子,如果拿到了就吃饭,如果拿不到,就释放所有的筷子。

2023-12-18 22:07:49 463

原创 Netty源码分析

在Java中,BIO代表阻塞I/O或同步阻塞I/O,是一种输入输出操作的方式。在BIO模型中,当一个线程发起一个I/O操作,例如读取数据或写入数据,该线程会被阻塞,直到数据被读取或写入完成。这意味着在数据被完全读取或写入之前,该线程不能做任何其他事情。BIO模型的主要问题是它的效率低下,因为在I/O操作期间,线程不能做任何其他事情。这在处理大量并发连接时可能会成为问题,因为每个连接都需要一个单独的线程来处理。

2023-12-18 20:46:51 347

原创 四、wait-notify

wait-notify必须配合synchronized,并且为重量级锁。await-signal必须配合lock。

2023-12-18 18:26:12 427

原创 三、详解Synchronized

为了解决这个问题,我们可以把修改变量的代码放在临界区内,这样在同一时刻只有一个线程能够修改这个变量,从而避免了数据不一致的问题。在Java中,我们可以使用synchronized关键字或者Lock接口来创建临界区。临界区是多线程编程中的一个术语,指的是一个访问共享资源的代码区域,这个区域不能被多个线程同时执行。也就是说,在同一时刻,只能有一个线程执行临界区的代码。临界区主要用于处理多线程环境下的竞态条件,防止数据不一致的问题。例如,当两个线程同时修改同一个变量时,就可能会出现竞态条件,导致数据不一致。

2023-12-15 16:54:33 951

原创 二、线程创建与运行

这个target就是run()方法中调用的target对象,也就是我们传递的Runnable对象。在方式1中,我们直接复写run方法,那么当线程运行的时候自然会直接执行我们复写的run方法,这个很好理解。我们看一下Thread的run方法。在java中通过继承Thread类,或者直接new一个Thread类来创建一个线程。通过实现一个Runnalbe接口,将此接口传递给Thread类,来创建一个线程。其实本质上线程池的方式也是利用上述两种方式来创建具体的对象。线程真正执行的逻辑就是run方法的逻辑。

2023-12-15 12:30:11 67

原创 一、并发基础知识

当一个任务在执行时,如果它需要等待另一个任务完成(例如等待I/O操作或者等待其他任务的结果),那么这个任务就会被阻塞,直到它所依赖的任务完成为止。但是,在等待操作完成的过程中,线程是被阻塞的。并发任务之间可能并不是真正同时执行的,例如,在单核处理器的系统中,虽然在任何给定的单一时刻只有一个任务在执行,但是由于任务之间的切换速度非常快,使得人们感觉它们似乎在同时执行。线程相比于进程,具有更小的资源占用,更快的创建和结束速度,以及更高的并发性,因此在需要大量并发操作,或者需要更高效率的场合,会使用多线程编程。

2023-12-15 11:41:07 1076

原创 六、jvm中常量池

在java文件中定义的数字或者字符串都成为字面量int a = 1;int b = 2;上述代码中,1、2、“hello” 都是字面量。对应着常量池中Integer_info和String_info。符号引用主要包含以下几种:1、类和节点的符号引用2、字段符号引用3、方法符号引用int a = 1;上述代码中a、b、 sayHello都是符号应用。

2023-12-12 20:47:58 45

原创 五、Jvm常用的工具使用

jmap -dump:format=b,file= :生成堆转储快照。其中, 是你想要保存快照的文件名, 是 Java 进程的 ID。在 Java 9 及更高版本中,jmap 命令已被 jhsdb jmap 命令取代。- jmap -histo[:live] :打印出堆中对象的统计信息,包括类、对象数量和字节数。- jmap -heap :打印出堆的概要信息,包括使用的 GC 算法、堆配置信息和 GC 统计信息等。

2023-12-12 11:41:04 45

原创 四、垃圾回收器

我们主要看 parnew+cms 和 g1。cms应用在老年代,并且采用标记-清除算法。

2023-11-28 16:07:25 66

原创 三、Class文件结构

4、常量的个数,2个字节,00----最大2的16次方。默认第一个常量为null,这个jvm的规范。3、主版本号,2个字节,00 34 ==》 54 ==》 jdk1.8。1、前4个字节为 CA FE BA BE。2、次版本号,2个字节, 00 00。

2023-11-27 18:28:09 49

原创 二、jvm对象创建及内存分配

当我们去new Object()的时候,首先先判断当前的类的父类是否被加载过,如果没有则先加载父类。将类的信息放入元空间。不管是那种内存分配方式,都会存在并发的问题,例如有多个线程同时new对象,那么就会有并发的问题。如果想要查看当前对象的头数据,可以引入jol包。

2023-11-16 21:52:36 71

原创 一、jvm内存模型的剖析

那么我们编写的一个helloworld.java文件如何成功运行的呢?线程执行会开辟栈空间,当每个线程执行方法的时候,会在栈中开辟栈帧。栈,又叫虚拟机栈,又可以叫线程栈。因为其与对应的线程相互依赖。那么栈帧中都包含什么呢?

2023-11-15 09:53:26 42

原创 关于一次sql的优化

1、查询避免回表2、使用二级索引字段进行排序2、深度分页改用join查询

2023-11-14 14:24:44 54

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除