摘要:对于我们而言,经常会遇到服务器服务出现异常的情况,一般情况下,我们可以通过查看应用日志解决。但是有些特殊情况就不适用了。 例如:服务器有段时间总是莫名挂掉了;应用访问变得特别慢;cpu占用突然变高又突然变低等等,这些就涉及到服务器管理相关操作。 最常见的异常:1.oom异常,服务器kill应用,我们 阅读全文
posted @ 2020-10-15 14:33 wuzhiaite 阅读(43) 评论(0) 推荐(0) 编辑
摘要:springmvc执行过程分析 源码分析 前端解析器的UML图 因为是对前端请求的URL进行处理,我们只需要看Servlet的继承类就可以了 初始化(主要工作:上下文初始化,和解析器初始化) FrameworkServlet 初始化Servlet的上下文, 调用子类的onFresh方法 进行初始化; 阅读全文
posted @ 2020-10-13 19:07 wuzhiaite 阅读(27) 评论(0) 推荐(0) 编辑
摘要:在集合使用中,我们经常会用到HashSet,一般用于过滤一组数据,保证数据唯一。今天看一下HashSet的源码,之前看过HashMap,再来看,HashSet可以说是很简单了。 源码分析 初始化 底层是通过HashMap存储数据的。 PRESENT成员变量用于HashMap的value值 priva 阅读全文
posted @ 2020-10-10 10:02 wuzhiaite 阅读(14) 评论(0) 推荐(0) 编辑
摘要:首先,我们先了解一下什么是阻塞队列: 当队列满了时,队列会阻塞插入元素的线程,直到队列不满; 当队列为空时,获取元素的线程会等待队列变成非空。 常用到的方法 上面是对阻塞队列的简单了解,下面重点分析一下LinkedBlockingQueue。 源码分析 Node节点 可以看出是单向的链表结构 sta 阅读全文
posted @ 2020-09-24 18:15 wuzhiaite 阅读(21) 评论(0) 推荐(0) 编辑
摘要:Semaphore主要用于对线程的控制,举个使用场景,几十个excel文件,数量千万。通过多线程几十个线程读取数据之后,要写入到数据库。但是数据库的连接数只有10。这个时候我们就要通过这个类对这些线程进行控制。因为数据写入时间过程,其他线程无法获取连接,出现无法获取数据库连接报错的情况。 主要的方法 阅读全文
posted @ 2020-09-24 10:35 wuzhiaite 阅读(16) 评论(0) 推荐(0) 编辑
摘要:CyclicBarrier一般也是用于对多个线程任务进行同步执行。是多线程并发开发中重要的一个工具类; 分析一下源码 初始化 //用于控制栅栏进入的锁 private final ReentrantLock lock = new ReentrantLock(); //条件锁 private fina 阅读全文
posted @ 2020-09-23 17:17 wuzhiaite 阅读(37) 评论(0) 推荐(0) 编辑
摘要:数据结构(和ConcurrentHashMap类似) 存储数据的基础结构时Node的数组; 节点中保存的是当前节点的hash,主键Key,对应值value,链表的next; transient Node<K,V>[] table; static class Node<K,V> implements 阅读全文
posted @ 2020-09-21 22:53 wuzhiaite 阅读(36) 评论(1) 推荐(1) 编辑
摘要:参考书:《Java并发编程艺术》 在学习这一块知识之前,可以先学习一下JMM相关的知识,回过来再看这个问题,就很好理解:https://www.cnblogs.com/perferect/p/13680158.html volatile 特性 可见性:对一个volatile变量的读,总能看到任意线程 阅读全文
posted @ 2020-09-21 00:21 wuzhiaite 阅读(28) 评论(0) 推荐(0) 编辑
摘要:Executor框架 在实际开发工作中,或多或少我们都用到过多线程。一般很少使用 new Thread(){run()}.start()这种创建线程。一方面影响代码规范性,另外一方面,也是不方便多线程管理。当大量任务时,线程的创建销毁都会占用很多计算资源。这也是为什么使用线程池的原因。 在日常工作中 阅读全文
posted @ 2020-09-16 15:03 wuzhiaite 阅读(63) 评论(0) 推荐(0) 编辑
摘要:FutureTask详解 作用:用于等待一个线程执行完毕后再执行另一个线程任务。一般用于Executors框架中,最常使用的是再ThreadPoolExecutor中,进行多线程任务; 注意: JDK1.8不在使用AQS进行线程管理; 取而代之的是通过CAS进行状态的切换,waiter线程节点由堆栈 阅读全文
posted @ 2020-09-14 18:19 wuzhiaite 阅读(44) 评论(0) 推荐(0) 编辑