- 博客(75)
- 收藏
- 关注
原创 多线程锁的总结
公平锁与非公平锁公平锁:非常公平,不可以插队非公平锁:不公平,可以插队,谁能力强,把谁优先可重入锁什么是可重入锁?可重入锁,也被称为递归锁,它指的是在同一个线程中,当外层方法获取锁的时候,如果内层方法也需要获取同一把锁,那么内层方法会自动获取到锁,不会因为外层方法已经获取过该锁且尚未释放而导致线程阻塞synchronized关键字和ReentrantLock都是典型的可重入锁实现。当线程重复获取同一个锁时,如果是不可重入锁,那么每次获取锁都需要进行线程同步,这会增加不必要的性能开销。
2024-04-22 20:00:24
483
原创 理解CAS
之前就谈论过,表示synchronized是不太友好的操作,在执行到锁时,会经历用户态与内核态的转变,非常耗时,而synchronized是一个很小的区域,就是细粒度很高的操作,而为了这一点点的操作去耗时,是非常不划算的。是非常消耗时间的,而线程的执行时间是非常短的,所以出现了线程池,只需要创建一次线程,下次使用的时候,就可以直接使用线程池中的线程了。线程B ,也拿到了number的值,然后将值 = 3 ,然后再次操作, number = 1,改回去了。因为是操作内存的,所以调度是非常快的。
2024-04-21 14:21:53
843
原创 SynchronousQueue
实现了BlockingQueue 和 Queue其中每个插入操作必须等待另一个线程相应的删除操作同步队列没有任何容量,甚至没有一个容量。
2024-04-20 19:43:51
166
原创 BlockingQueue
BlockingQueu方法有四种形式,具有不同的操作方式,不能立即满足,但可能在将来的某个时间点满足:一个抛出异常,第二个返回一个特殊值(
2024-04-17 23:23:25
670
原创 ReadWriteLock
在写入与读取的时候,会被其他线程插队,对于读取线程是不要紧的,但是对于读取线程,就会出现很多的问题。在以前我们可以synchronized ,ReetrentLock锁住。加入读写锁ReadWriteLock。
2024-04-17 23:22:10
246
原创 ReadWriteLock读写锁
在写入与读取的时候,会被其他线程插队,对于读取线程是不要紧的,但是对于读取线程,就会出现很多的问题。在以前我们可以synchronized ,ReetrentLock锁住。加入读写锁ReadWriteLock。
2024-04-16 22:58:21
474
原创 CountDownLatch
如何使用CountDownLatch使得角色裁判,喊完各就位预备后,发枪,这个两个动作后,运动员才开始跑。倒计时锁存器,,,,count计数,down停止,Latch锁。需要使用callable接口,而不是runnable接口。运动员类【runner】裁判类 【Judge】
2024-04-15 23:03:30
351
原创 HashMap与HashSet的不安全问题
HashMap 的底层实现基于哈希表(Hash Table)结构,并结合了 数组 和 链表 或红黑树。因为addIfAbsent这个类用来重入锁ReetrantLock,所以他可以实现同步,并发执行。当创建一个CopyOnwriteArraySet时,其实就是创建了一个ArrayList。看看CopyOnWriteArraySet的add方法。这是HashMap底层的数组【桶】与ArryList类似。
2024-04-14 20:57:18
936
原创 ArrayList中多线程的不安全问题
方案二:List list = Collections.synchronizedList(new ArrayList<>());写入时复制,就是在写入时,先将原数据复制,再将需要的数据插入,最后返回给原数组。多个线程同时去添加ArryList,出现了报错,抛出来异常。方案一:List list = new Vector();为什么可以这样输出,是一种函数是接口,我们先过个耳熟。因为synchronized是不高效的行为。ArrayList.add方法是不安全的。该方法使用了Lock锁,所以是安全的。
2024-04-10 22:48:24
679
原创 生产者与消费者的问题与进阶
它指的是线程可以在没有被明确通知、中断或超时的情况下被唤醒。这意味着即使在没有满足特定条件的情况下,线程也可能从等待状态中被唤醒,这种情况就被称为虚假唤醒当线程被虚假唤醒时,它可能会继续执行后续的代码,而这些代码可能依赖于某些尚未满足的条件。这可能导致程序的行为与预期不符,引发错误或异常为了处理虚假唤醒,应用程序通常需要采用一种策略来重新检查唤醒条件。这通常通过在。
2024-04-09 23:50:20
324
原创 多线程基础
线程start(),并不是启动了,而是将加入到就绪队列,是与主线程一起的呢,再有cpu分配资源实现多线程的方式存在两个类 ,实现Runnable接口,同时重写run方法Thread类也是实现了 Runnable接口。
2024-04-07 20:40:05
967
原创 多线程入门
线程start(),并不是启动了,而是将加入到就绪队列,是与主线程一起的呢,再有cpu分配资源实现多线程的方式存在两个类 ,实现Runnable接口,同时重写run方法Thread类也是实现了 Runnable接口。
2024-04-03 08:39:56
355
原创 @RequestBody与@RequestParam的区别
总的来说,@RequestParam适用于提取简单的查询参数,而@RequestBody适用于处理复杂的非表单数据。@RequestParam会从http请求查询参数中提取数据。@RequestBody会将请求体中的数据,转换成对象。
2024-04-01 08:53:34
1223
原创 流式编程,优雅的代码
这段代码利用Java 8的流式处理特性,简洁而优雅地完成了消息的转换和收集工作。这段Java代码是使用了Java 8的Stream API来处理一个名为。今天看到了一个新奇的写法,是我没有学过的,也是没有见过的。,代表列表中的每一个消息实体)。操作来转换Stream中的每一个元素(这里是。对象都根据原始消息实体进行了相应的字段设置。方法,获取一个消息列表。返回的原始消息列表转换成一个新的。整体来看,这段代码的目的是将。
2024-04-01 08:46:41
739
原创 Springboot整合RabbitMQ
如果把接收与发送服务为了测试,写在一个类中,那么其实都不用调用服务,当启动后,就会一直监听,然后消费服务,所以你看不到服务的消费。回答:都是推荐的【生产者、消费者、两边】,但是配置在消费者更好一点,消费者一般是先启动的,交换机,让交换机时时监听。默认如果在windows安装了rabbitmq是不用配置信息的,因为存在默认的配置。交换机----队列----队列绑定交换机。还是一样,接收者是通过队列来进行接受的。要是是路由模式,可以添加一个路由,什么类型的交换机,就返回什么类型。以上就是可以这样配置的原因了。
2024-03-31 08:48:05
1174
原创 Rabbit简单模式理解
代码流程上述消息没有设置为持久化没持久化,消息创建了依旧存在,除非服务器重启,就会删除持久化,服务器重启后都不会删除发送消息。
2024-03-31 08:38:09
726
原创 rabbitMQ版本问题与下载
所以需要找24版本以下的erlang,而不同erlang对应不同rabbitmq所以需要对应。云服务器买的是centos7,而erlang在24版本后不支持centos7了。说实话,自己安装,还是没弄好,最好推荐别的博主的。都到现在了,大家不会安装东西还是不看版本吧。
2024-03-30 21:52:29
508
1
原创 Redis事务
Redis单条命令是保存原子性的,Redis事务是不保证原子性的事务的本质:是,事务的所有命令都会被序列化在事务执行时,一次性执行,排他性、顺序性。
2024-03-25 22:38:26
463
原创 Redis五种基本数据类型
微博、将所有关注的人放在一个集合中,他的粉丝也放在一个集合中,共同好友,用户信息保存:变更信息的内容,共同关注:差集、补集。
2024-03-24 23:33:49
251
原创 Nginx介绍,正向代理与反向代理
国内访问外网就需要 “梯子” ,梯子就是将你的请求转发给 代理服务器 【在国外】,然后通代理服务器访问外网。你想买adidas,直接去门店购买,那么门店就是代理服务器,代理的对象是adidas。
2024-03-20 09:28:10
268
原创 Redis安装
只能在Github上下载,官网只提供Linux版本解压客户端启动成功使用Redis客户端快速链接服务端开启的情况下,双击redis-cli.exe。
2024-03-18 20:52:05
495
原创 Docker配置Nginx、tomcat、elasticsearch
遇到的问题:当我们运行了tomcat之后,是无法访问tomcat的首页的,这是因为镜像使得tomcat变成精简版本,只要能运行的版本就行,所以,如果想访问的话,就需要进行相关操作。elasticsearch是什么耗内存的,因此需要修改配置,限制内存。
2024-03-16 08:28:18
654
原创 Dockerfile
dockerfile是构建镜像的文件那么构建镜像的基本步骤1、编写dockerfile文件2、docker build 构建成为一个镜像3、doker run 运行镜像4、docker push 发布镜像(Docker Hub 或者阿里云)(a)、Dockerfile:构建文件定义了步骤(b)、DockerImages是构建生成的镜像,最终发布和运行的产品©、容器就是镜像运行起来的服务器。
2024-03-16 08:23:51
699
原创 Docker 进阶
就是当容器内存在了mysql,在里面书写了数据,如果容器删除了,那么数据也就没有了,通过容器数据卷的技术,可以让容器内的数据持久化到Linux服务器上。
2024-03-13 22:49:54
607
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人