- 博客(49)
- 收藏
- 关注
原创 设计模式之模板模式
1. 介绍1.1 定义定义一个模板结构,将具体内容延迟到子类去实现。1.2 主要作用在不改变模板结构的前提下在子类中重新定义模板中的内容。1.3 解决的问题提高代码复用性 将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中 实现了反向控制 通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”2.2 实例讲解接下来我用一个实例来对模板方法模式进行更深一步的介绍。ex:一个人一天的生活 起...
2020-07-27 17:42:07
122
原创 IO 多路复用
目录1、什么是IO多路复用?2、为什么出现IO多路复用机制?3、IO多路复用的三种实现方式4、select函数接口5、select使用示例6、select缺点7、poll函数接口8、poll使用示例9、poll缺点10、epoll函数接口11、epoll使用示例12、epoll缺点13、epoll LT 与 ET模式的区别14、epoll应用15、select/poll/epoll之间的区别16、IO多路复用完整代码实现17、高频面试题1、什么是IO多路复...
2020-07-25 14:16:46
217
转载 抢红包算法
https://blog.youkuaiyun.com/bjweimengshu/article/details/80045958###
2019-11-08 12:22:39
207
原创 JAVA CAS以及ABA问题解决方案
在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),...
2019-09-03 11:35:09
592
原创 google guava使用
本文不断更新集合:Map<String, String> map = Maps.newHashMap();List<String> list = Lists.newArrayList();Set<String> set = Sets.newHashSet();//list 添加元素 这样比较麻烦List<String> lista...
2019-08-29 18:22:55
171
原创 分布式事务解决方案之基于RocketMQ
本文不仔细讲,详细的网上都有,画个流程图可以帮助理解一下参考石杉的架构笔记我们来解释一下这个方案的大概流程: A系统先发送一个prepared消息到mq,如果这个prepared消息发送失败那么就直接取消操作别执行了,后续操作都不再执行 如果这个消息发送成功过了,那么接着执行A系统的本地事务,如果执行失败就告诉mq回滚消息,后续操作都不...
2019-06-25 17:49:11
1694
原创 分布式事务解决方案之数据库事务XA 2PC
名词:XA:数据库分布式事务资源管理器:数据库事务管理器:与mysql连接的客户端相当于事务管理器2pc协议:TWO phase(阶段) commitment protocol出错回滚:java的具体实现可以参考 atomikos,springboot+jta具体jar为实现原理读取生成的日志读取事务的id,来实现2PC,由于这种方式适合一个应用多...
2019-06-24 16:48:24
403
转载 java.io.IOException: Too many open files问题
在开发linux在线服务器的时候经常会遇会句柄泄露的问题。因为在linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,在我们进行打开的时候会返回一个fd,即是文件句柄。如果频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象。在linux系统中对进程可以调用的文件句柄数进行了限制,在默认情况下每个进程可以调用的最大句柄数是1024个...
2019-05-31 15:15:05
25080
1
原创 设计模式之build模式
build模式是为使复杂对象,简单化 。public class Blog { private String name; private int age; private String address; private String ID; private Blog(Builder builder) { this.name ...
2019-05-31 09:53:44
372
转载 唤醒指定线程
本文出自https://www.cnblogs.com/qingquanzi/p/8228422.html一、简单俗话说,没有比较就没有伤害。这里咱们还是通过对比来介绍LockSupport的简单。在没有LockSupport之前,线程的挂起和唤醒咱们都是通过Object的wait和notify/notifyAll方法实现。写一段例子代码,线程A执行一段业务逻辑后调用wait阻...
2019-05-28 09:59:32
6925
原创 TCP粘包拆包原因以及解决办法
粘包、拆包发生原因1要发送的数据大于TCP缓冲区剩余的大小,发生拆包2要发送的数据大于MSS(最大报文长度),发生拆包3要发送的数据小于TCP缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,发生粘包4接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。等等粘包、拆包表现形式现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,...
2019-05-21 11:54:59
1185
原创 阿里Arthas(阿尔萨斯)线上诊断工具
Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。官方文档:https://alibaba.github.io/arthas/index.html当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无...
2019-05-08 14:57:22
4266
原创 阻塞和非阻塞,同步和异步
https://mp.weixin.qq.com/s/mEahtWqeFqzzaETHKAWtzw阻塞和非阻塞,同步和异步1 例子故事:老王烧开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。老王想了想,有好几种等待方式1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没。-同步阻塞老王想了想,这种方法不够聪明。2.老...
2019-04-19 18:40:50
146
原创 浏览器请求响应的过程
我们在浏览器输入http://www.baidu.com 之后知道页面展示,那么其中的过程是什么样子呢下面我们从HTTP TCP IP讲解一下1.当用户在浏览器输入http://www.baidu.com之后 DNS会解析这个域名,把解析到的ip给客户端这里为什么要解析域名呢,因为计算器识别不了域名只能识别ip 但是人类的记忆对于数字不是很好,域名是为了给人类方便记忆的,回到正题...
2019-04-18 11:07:15
336
原创 Redis内存淘汰机制
Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷。Redis最常见的两种应用场景为缓存和持久存储,首先要明确的一个问题是内存淘汰策略更适合于那种场景?是持久存储还是缓存?内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。说白了就是为了省内存...
2019-04-12 18:37:51
1692
原创 Redis 主从以及哨兵配置
主从:配置如下在redis.conf文件中配置搜索 slaveof <masterip> <masterport><masterip> 设置 主节点的 ip<masterport> 端口如果有密码masterauth 设置密码之后启动redis 连接客户端执行命令则显示为从服务哨兵模式什么是哨兵模式 当redi...
2019-04-10 20:19:35
458
原创 Redis 持久化方式
Redis有两种持久化方式 RDB AOF1.RDB方式配置:当在规定的时间内,Redis发生了写操作的个数满足条件,会触发发生BGSAVE命令当用户设置了多个save的选项配置,只要其中任一条满足,Redis都会触发一次BGSAVE操作比如:900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作都会触发发生快照操作save 900 ...
2019-04-10 17:15:18
128
原创 缓存穿透,缓存击穿,缓存雪崩解决方案
1.缓存穿透1.1.什么是缓存穿透 正常情况下我们去查数据都是存在的 那么请求一条压根不存在的数据也就是缓存和DB都没有的数据那么请求就都会落在DB上面了 这种查询不存在的数据成为缓存穿透1.2.缓存穿透带来的问题,如果有黑客攻击无限请求一个不存在的数据那么请求的压力都会落在DB,那么DB就有可能宕机1.3.缓存穿透解决方案 1.3.1之所以是因为发生缓存穿透是因为获取的...
2019-04-01 10:50:25
889
原创 Http连接池
基于HttpClient4.5package com.example.demo;import org.apache.http.HttpEntity;import org.apache.http.NameValuePair;import org.apache.http.client.config.RequestConfig;import org.apache.http.client....
2019-01-22 15:26:58
1320
原创 HttpClient连接池
基础HttpClient4.4.1 因为每个HttpClient版本的连接池 实现都不一样package com.moji.launchserver.test;import org.apache.http.HttpEntity;import org.apache.http.HttpEntityEnclosingRequest;import org.apache.http.HttpH...
2019-01-21 18:59:50
3365
转载 CountDownLatch使用场景及分析
JDk1.5提供了一个非常有用的包,Concurrent包,这个包主要用来操作一些并发操作,提供一些并发类,可以方便在项目当中傻瓜式应用。 JDK1.5以前,使用并发操作,都是通过Thread,Runnable来操作多线程;但是在JDK1.5之后,提供了非常方便的线程池(ThreadExecutorPool),主要代码由大牛Doug Lea完成,其实是在jdk1.4时代,由于java语言内置...
2019-01-02 16:08:40
3489
1
原创 使用位运算,处理"多选状态标识"
public class sss { public static void main(String[] args) { //极不易发 int a = 1; //不易发 int b = 2; //较易发 int c = 4; //易发 int d = 8; ...
2018-12-11 17:17:53
1490
转载 Spring @Autowired注解在非Controller中注入为null
/** * * Token 工具类 */@Component // 关键1,将该工具类注册为组件, 加粗!!!public class TokenUtil { @Autowired private TokenRepository tokenRepository; @Autowired private TokenService tokenServ...
2018-12-04 10:17:50
276
原创 springboot filter2种方法
第一种方法:注解 package com.example.demo.filter;import org.springframework.core.annotation.Order;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServ...
2018-08-28 11:01:15
1557
1
转载 Netty 事件
在netty的pipeline中包含两种类型的事件,分别为inbound和outbound,inbound为上行事件,outbound为下行事件。inbound事件为被动触发,在某些情况发生时自动触发;outbound为主动触发,在需要主动执行某些操作时触发。inbound事件一般通过pipeline的fire**方法触发,包含如下:1.fireChannelRegisteredchannel注册...
2018-06-29 11:57:19
2074
转载 TCP UDP的区别
TCP UDPTCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少; 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UDP); 5.TCP保证数据正确性,UDP可能丢包 6.TCP保证数据顺序,UDP不保证 UDP应用场景: 1.面向数据报方式 2.网络数据大多为短消息 3.拥有大量Client 4.对数据安全性无特殊...
2018-03-28 22:39:17
122
转载 java中的基本数据类型存放位置
基本数据类型是放在栈中还是放在堆中,这取决于基本类型声明的位置。 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因 在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。 ...
2018-03-19 23:06:32
4840
原创 多线程之可重入锁
当一个线程得到对象锁后,再次请求此对象锁时是可以再次得到改对象的锁的“可重入锁”的概念:自己可以再次获得自己内部的锁,比如有一条线程获得了某个对象的锁,此时这个对象的锁还没有释放,当再次获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话就会造成死锁。例如:synchronized和ReentranLock都是可重入锁public class Service { s
2018-01-08 16:02:16
319
转载 分布式锁原理及实现方式
本文转自:http://www.hollischuang.com/archives/1716目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两
2018-01-08 11:58:29
178
原创 Mybatis 查询 or 语句
public List test() { SystemUsersExample example = new SystemUsersExample(); Criteria ariteria = example.createCriteria(); Criteria ariteria2 = example.createCrit
2017-12-21 16:40:57
6135
原创 java链表及数组的区别
数组:数组在查询上通过索引会效率很高,但是在删除增加上面效率很低链表:java链表都是双向链表,在删除和增加上面效率会很高,但是在查询上面效率很低如图所示 数组在删除或者增加的时候 起他元素的位置要改变,但是链表在删除增加的 之后只需要改变他的next 和previous就可以。而数组的位置是固定的所以查找很方便,但是链表的查找需要从头或者尾部(size/2法则)去一个一个查找所以就慢,(
2017-12-14 09:45:11
566
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人