- 博客(83)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 可重入锁 ReentrantLock AQS 源码解析
使用范例Lock lock = new ReentrantLock();lock.lock();try { dosomething();} finally { lock.unlock();}在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。接口结构Lock是个顶级接口,构建了锁的生态环境void lock();获取锁。如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得该锁为止void lockInterru
2020-12-11 23:22:42
320
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 JAVA 线程池ThreadPoolExecutor源码阅读与分析
线程池是什么提前创建好若干个线程,如果有任务需要处理,这些创建好的线程就会开始处理任务,处理完之后线程并不会被销毁而是被保存起来,而是等待下一个任务。为什么需要线程池创建和销毁线程都是消耗系统资源的。线程模型又分为用户线程,与内核线程。用户线程ULT用户程序实现的,不依赖系统核心,应用自己管控线程,不需要进行用户态/内核态的切换。操作系统内核无感知。内核线程KLT系统内核管控,内核保存上下文状态和信息,多处理器情况上能并发运行,线程的创建于同步由内核完成,能够调度CPU资源。一个小测试
2020-12-09 00:47:31
306
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 延迟队列 DelayQueue 使用与源码解析
当内存中有一堆的客户信息,需要实时移除VIP到期的客户的特权时有以下做法。做法1:定时一段时间检查一遍所有的元素,如果客户的VIP到期日期小于当前,则取消客户的VIP特权。做法2:利用优先队列小顶堆的结构,将最快要过期的客户信息放置在堆顶,一个消费线程去poll堆顶元素并且处理,这样就不用去遍历全部的元素了。当日期不到时便让线程等待多长时间,当时间到时唤醒线程处理。以上做法2有现成的队列可以使用,就是接下来要说的延迟队列。DelayQueue结构是不是跟优先队列很像。DelayQueue其
2020-11-30 19:30:37
346
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 PriorityQueue PriorityBlockingQueue 优先级队列与优先级阻塞队列 源码解析
试想一下,如果要在一堆数据中找出最大的或者最小的是不要进行一次遍历,时间复杂度为O(N)还能不能优化,比如O(1)的时间复杂度就能获取到。这就是这篇博客需要说的PriorityQueue优先级队列。先看结构完全二叉树:一棵有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,节点得插入永远在下一个位置。下面得紫色的那排小字就是节点的序号。那么第N个元素的左孩子queue [2 * n + 1]右孩子就是queue [2 *(n + 1)]。看到源码就会发现PriorityQueue存储
2020-11-26 17:32:25
534
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 BlockingQueue 的使用与源码阅读
结构其中数组是循环使用的,真实中不存在从3到1的指针,使用的是putIndex,takeIndex两个下标索引。当此时存放的元素putIndex等于数组的长度-1时,putIndex下次就会变成0,又从头开始存放元素。takeIndex原理一样。基于数组实现的,并且内部持有一把ReentrantLock(读写一把)。ArrayBlockingQueue的使用简单说一下情况,后面从方法中分析。生产线程将元素放入队列中时需要先获取锁,获取到锁后向队列存放元素。消费线程获取队列中元素时也需要先获取锁,
2020-11-25 19:04:13
131
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 万字长文 图文阅读 JDK8 ConcurrentHashMap源码 带你吊打面试官
ConcurrentHashMap结构数组+链表+红黑树。链表大于8转红黑树,红黑树节点数小于6退回链表。跟HashMap是一样的。只是支持并发的操作存放的key-value的Node节点。结构几乎一样,但是有个很重要的地方,val,next都被volatile,保证在多个线程之间的可见性。static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key
2020-11-21 23:19:01
1523
7
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Java List的remove()方法陷阱以及性能优化
Java List在进行remove()方法是通常容易踩坑,主要有一下几点循环时:问题在于,删除某个元素后,因为删除元素后,后面的元素都往前移动了一位,而你的索引+1,所以实际访问的元素相对于删除的元素中间间隔了一位。使用for循环不进行额外处理时(错误)//错误的方法for(int i=0;i<list.size();i++) { if(list.get(i)%2==0) {...
2019-05-25 17:55:02
33783
17
原创 手把手带你实现 rabbitmq 保证消息不丢失 MQ消息稳定性
MQ运行图哪些步骤会发生消息丢失生产者到MQ之间丢失,网络抖动通信异常。MQ中的消息还没有完成异步存盘,MQ宕机,再重启消息丢失。消费者获取到消息之后,没有来得及处理完毕,自己直接宕机了。属于操作不当,消费者没有将消息投递到对应的Exchange中导致消息丢失解决方案MQ宕机之后消息丢失开启消息持久化MQ将消息持久化到磁盘中通常情况是,等到有几千条消息的时候,会一次性的刷盘到磁盘上面。消息在MQ内存中还没有刷盘到磁盘就宕机了,消息依旧还是会丢失。需要下面的confirm机制,co
2021-03-06 17:22:06
450
原创 FutureTask 源码阅读 使用Callable创建多线程
接上文线程池源码阅读线程池调用Future<?> submit(Runnable task);返回一个FutureTsk。简单使用public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<Integer> future = new FutureTask(new MyCallable()); Thread th
2021-03-05 18:08:56
317
原创 了解JVM垃圾回收器
Serial收集器这个收集器是一个单线程工作的收集器。使用一个收集线程去完成垃圾收集工作它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束(“Stop The World”)Serial Old收集器ParNew收集器实质上是Serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为都与Serial收集器一致Parallel Scavenge收集器Parallel Old收集器CMS收集器Garbage First收集器Shenandoah收集
2021-02-21 14:06:03
206
1
原创 JVM垃圾回收算法
标记-清除算法算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程。标记-复制算法标记-整理算法...
2021-02-20 14:59:29
153
原创 SpringBoot 整合RabbitMQ使用
添加用户。none不能访问 management pluginmanagement列出自己可以通过AMQP登入的virtual hosts查看自己的virtual hosts中的queues, exchanges 和 bindings查看和关闭自己的channels 和 connections查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。policymaker查看、创建和删除自己的virtual hosts所属的po
2021-02-06 18:02:43
482
原创 FastJson 泛型解析出错解决
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannotbe cast to X有问题的写法:data = (A) JSON.parseObject(str,A.class);修改之后data = JSON.parseObject(str, new TypeReference<A<T>>(){});
2021-02-03 16:25:39
628
原创 循环依赖的解决
是什么循环依赖,也就是两个或者两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:代码中的体现@Componentpublic class A { // A中注入了B @Autowired private B b;}@Componentpublic class B { // B中也注入了A @Autowired private A a;}解决循环依赖的本质先去缓存Map里找Bean,没有则
2020-12-23 16:41:30
440
原创 FactoryBean的使用
FactoryBean的用法在某些情况下,实例化bean过程比较复杂,如果还是采用配置的方法,需要在中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。public interface FactoryBean<T> { T getObject() throws Exception; Class<?> get
2020-12-21 17:31:54
762
1
原创 ReentrantReadWriteLock 源码学习
是什么读写锁在同一时刻可以允许多个读线程访问,但是写线程操作时,所有的读线程和其他写线程均被阻塞。使用例子public class LockTest { private static ReadWriteLock lock = new ReentrantReadWriteLock(); /** * 读取资源 */ public void read() throws InterruptedException { lock.readLock().
2020-12-15 20:29:11
134
原创 volatile关键字 可见性 有序性 原子性 内存语义
理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) {...
2020-12-09 22:51:03
236
原创 JAVA retry 使用
简介retry不是关键字他是一个标记有点类似于goto,goto是Java中的保留字,在目前版本的Java中没有使用。retry后面跟循环,标记这个循环开始的位置。后续在continue或者break后面加retry。continue retry从这个标记的循环继续执行,不是重新开始,而是继续执行。break retry跳过这个标记的循环break retry 例子public static void main(String[] args) { retry: for
2020-12-07 19:00:06
147
原创 Java线程池简单使用学习
常用的五种类型线程池newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPoolnewWorkStealingPoolnewFixedThreadPool定长线程池,控制线程最大并发数,超出的任务会在队列中等待。public static void main(String[] args) { ExecutorService pool = Executors.newFixedTh
2020-12-07 16:34:21
192
原创 多线程学习之线程的创建与终止
线程的几种创建模式通过实现Runnable接口来创建Thread线程:public class Main { public static void main(String[] args) { MyThread task = new MyThread(); Thread thread = new Thread(task); thread.start(); } static class MyThread implements Runn
2020-12-06 16:44:18
212
原创 数组 List 去除重复数据 多种实现及性能分析
有序的情况下去重单指针法:前者与后者比01、使用两个for循环实现List去重(有序)双层针法:02、使用List集合contains方法循环遍历(有序)双层针法:contains方法调用indexof方法,内部实现还是循环遍历03、使用HashSet实现List去重(无序)04、使用TreeSet实现List去重(有序)05、使用java8新特性stream实现List去重(有序)桶排序法:...
2020-11-22 15:01:28
403
原创 Iterator简介 LinkedList使用迭代器优化移除批量元素原理
public interface Iterator<E> { /** *是否还有下一个元素 */ boolean hasNext(); /** *下一个元素 */ E next(); /** * 从集合中删除最后一个返回的元素 */ default void remove() { throw new UnsupportedOperationException("remove
2020-11-12 20:12:16
638
原创 Consumer接口
Consumer接口@FunctionalInterfacepublic interface Consumer<T> { /** * 对给定参数执行消费操作。 */ void accept(T t); /** * 如果一个方法的参数和返回值全都是 Consumer 类型, * 那么首先做一个操作, 然后再做一个操作。来完成一个链式操作 */ default Consumer<T> andThen
2020-11-11 23:36:59
215
原创 LinkedList 一篇就够
创建List<Integer> list = new LinkedList<>();结构 双向链表继承关系public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, SerializableSerializable接口中内容是空的,是一个标志接口,一个类只有实现了Ser
2020-11-11 21:48:21
155
原创 ArrayList 一篇就够
平常开发中以下语句可能是最经常写的语句之一List<Integer> list = new ArrayList<>();继承关系public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableArrayList顶层接口是Collection,List,RandomAcce
2020-11-11 17:20:18
236
1
原创 别再问HashMap原理和扩容机制了 一篇彻底搞定HashMap源码
核心方法Node<K,V>[] resize()第一次初始化时候调用存放的键值对的数量大于第三种:HashMap不是第一次扩容。如果HashMap已经扩容过的话,那么每次table的容量以及threshold量为原有的两倍。
2020-11-10 14:24:11
555
1
原创 rabbitmq 怎么保证消息的稳定性(怎么避免消息丢失)
• 生产者发出后保证到达了MQ。为了解决这个问题,RabbitMQ引入了事务机制和发送方确认机制(publisher confirm),由于事务机制过于耗费性能所以一般不用。另一个就是消息发送到MQ那端之后,MQ会回一个确认收到的消息给我们。• MQ收到消息保证分发到了消息对应的Exchange。消息找不到对应的Exchange。找不到对应的Queue。这两种情况都可以用RabbitMQ提供的mandatory参数来解决,它会设置消息投递失败的策略,有两种策略:自动删除或返回到客户端。• Exch.
2020-10-14 00:33:43
1823
原创 数据库事务四种隔离级别
多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离四种隔离级别读未提交可以读到未提交的内容,因此,在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的。读提交只能读到已经提交了的内容。会发生不可重复读 ,两个并发的事务,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。可重复读专门针对“不可重复读”这种情况而制定的隔离级别,是MySql的默认隔离级别。
2020-10-13 23:20:12
173
原创 Java NIO网络编程
Selector:用于检查(轮询)一个或多个NIO Channel的状态是否有事件发生。有相应事件发生则执行相应逻辑。这样既可实现了利用一个线程无管理多数连接。不用再一个客户端一个连接。避免了多个线程的切换与维护。selectionKey代表socket与Select之间发生的事件关系。OP_ACCEPT:有新的网络连接可以建立(accept),值为16OP_CONNECT:连接已经建立...
2019-12-19 22:27:33
203
原创 kafka Linux安装
在安装kafka之前需要先安装 jdk安装:https://blog.csdn.net/wsdfym/article/details/103164921 zookeeper:https://blog.csdn.net/wsdfym/article/details/103166540下载kafkahttp://kafka.apache.org上传到linux服务器,解压tar zxvf...
2019-11-21 21:34:27
173
原创 ZooKeeper linux部署
下载地址:http://zookeeper.apache.org/releases.html使用xftp上传到linux服务器/opt目录下,并且解压# tar zxvf zookeeper-3.4.14.tar.gz这是他的目录文件。初次使用的时候需要修改/conf目录文件下的zoo_sample.cfg文件,重命名为zoo.cfg使用命令 # vim /opt/zookeeper-...
2019-11-20 20:29:17
202
原创 Linux 环境下安装Jdk 配置环境变量
下载jdk,借助xftp上传至服务器,放到/usr/local/src下面到该目录下# cd /usr/local/src,解压# tar zxvf jdk-12.0.2_linux-x64_bin.tar.gz修改目录名字(主要是方便后续操作)# mv jdk-12.0.2 /usr/local/jdk-12设置环境变量# vim /etc/peofile //在文件末尾添加...
2019-11-20 16:37:35
204
原创 ZooKeeper Leader选举
ZooKeeper集群中的三种服务器角色:Leader、Follower和 Observer。服务器启动时期的Leader选举隐式条件便是ZooKeeper的集群规模至少是2台机器。最好是单数台,例如3台。当有一台服务器,我们假设这台机器的myid为1,启动的时候,是无法进行Leader选举的。当第二台机器,假设这台服务器的myid为2,也启动后,此时这两台机器已经能够进行互相通信,每台机...
2019-11-20 12:42:57
236
原创 ZooKeeper 分布式锁
分布式锁分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。平常使用的都是数据库中的表锁或者行锁,但是目前绝大多数大型分布式系统的性能瓶颈都集中在数据库操作上。使用ZooKeeper实现分布式锁即可减轻数据库...
2019-11-19 21:49:55
182
原创 BASE理论
BASE=Basically Available(基本可用),Soft state(软状态),Eventually consistent (最终一致性)三个短语的简写。BASE是对CAP中一致性和可用性权衡的结果,是基于 CAP 定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性基本可用基本可用是指分布式系统在出现...
2019-11-18 00:23:15
219
原创 CAP定理
CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。一致性(C:Consistency)在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。执行更新操作后,应该保证系统的数据仍然处于一致的状态。如果对第一...
2019-11-18 00:06:09
149
原创 ACID 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability
原子性Atomicity指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现以下两种状态之一.全部成功执行。· 全部不执行。任何一项操作失败都将导致整个事务失败,同时其他已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。一致性Consistency一个事务在执行之前和执行之后,数据库都必须处于一致性状态。事务都完成成功...
2019-11-17 23:22:53
506
原创 java 线程的状态
线程的状态NEW:初始状态,线程被构建,但是未调用start()方法。RUNABLE:运行状态,操作系统中的“就绪”,“运行”BLOCKED:阻塞状态是指线程因为某种原因放弃了cpu 使用权,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得时间片运行。阻塞的情况分三种:(一). 等待阻塞:线程调用object.wait()方法后,线程状态由RUNNING变为W...
2019-11-05 23:03:25
169
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人