
高并发
卡肤卡
这个作者很懒,什么都没留下…
展开
-
负载均衡之跑马竞赛算法
跑马竞赛算法是什么?是一种能良好感知服务端负载进行连接的负载均衡算法。当客户端与服务端进行长连接时,客户端需要选择合适的一台服务器节点起进行连接。客户端选择服务端的ip有多种方式,跑马竞赛算法相比于其他又有什么优点呢,怎么去实现,接下来一一讲解客户端与服务端进行长连客户端通过http请求服务端拿到服务端所有的ip节点后,开始要选择一个ip进行连接,怎么选择ip呢?方式1:hash取模首先获取到客户端的ip,对客户端ip的hash对服务端节点数进行取模,模的位置就是ip的位置//原创 2020-06-15 22:11:58 · 967 阅读 · 1 评论 -
ThreadLocal内存溢出(OOM)的原因
ThreadLocal是Java提供的一个线程安全类,其原理是每个线程都拥有各自的变量内存副本。其实就是每个线程Thread里都有一个ThreadLocalMap类,用于存储变量值。更新、删除操作时,都是操作各自线程里的hreadLocalMap类,互不影响,从而达到的线程安全ThreadLocal经常用于一次调用的上下文储存场景,例如一次调用的token、traceId,在调用的各个阶段都有...原创 2019-11-24 21:20:57 · 2774 阅读 · 0 评论 -
基于多路复用IO的Reactor模型实现
对NIO的了解请看我上篇博客,此处不作过多叙述https://blog.csdn.net/CSDNzhangtao5/article/details/103023972Reactor模式是一种事件处理模式,单个或多个事件(Event)并发地投递到事件处理服务(Service Handler),事件处理服务将事件进行分离,同步的将他们分发到对应的事件处理器中去处理。把事件的产生于事件的...原创 2019-11-13 22:56:37 · 550 阅读 · 0 评论 -
NIO多路复用以及select/poll/epoll
IO多路复用机制:程序注册一组socket文件描述符给操作系统,监视这些fd是否有IO事件发生,有了就告诉程序处理。是一种触发式、批量式的解决方案。现在主流的中间件:netty、kafka都是采用的多路复用技术,来提升并发吞吐量首先我们先了解BIO当用read去读取网络的数据时,是无法预知对方是否已经发送数据的。因此在收到数据之前,能做的只有等待,直到对方把数据发过来,或者等到网络超...原创 2019-11-12 13:20:49 · 625 阅读 · 0 评论 -
CAS自旋原理
CAS是Java并发包工具类底层使用的算法,他有效的避免了并发,像AtomicInteger、Semaphore、ReentrantLock底层都采用了CAS算法cas即compare and swap(比较与交换),它涉及到三个操作数:内存值、预期值、新值。当且仅当预期值和内存值相等时才将内存值修改为新值 。 其中比较与交换是原子操作。下面对着例子来说: 分析AtomicInteger的add原创 2017-12-18 20:12:12 · 4535 阅读 · 0 评论 -
mysql事务隔离级别为Read uncommitted产生脏读原因
Read uncommitted是mysql innodb引擎的最低事务隔离级别。他并不能保证并发情况下的数据的安全性。例如使用jdbc事务模仿Read uncommitted隔离级别:import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sq原创 2017-04-10 14:00:27 · 2434 阅读 · 2 评论 -
java 并发包之Semaphore
Semaphore是java5之后并发包里的工具类。是用来在并发时控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。例如一个奶茶店,同时只能为5个人提供服务,其余的人必须等待其前面五个人服务完毕后才能接受服务,如果所有的人同时一窝蜂的去请求服务那会导致很多问题发生甚至奶茶铺崩溃。使用场景: 项目中某个核心接口需要频繁的访问数据库资源,频繁的io操作,如果高并发时,同时1原创 2017-04-04 22:37:32 · 566 阅读 · 0 评论 -
java 并发包之countDownLatch
countDownLatch是Java.util.concurrent里的并发工具包。它是让某个线程等待其他线程处理完再执行。所用场景:例如导出10万条的订单记录时,需要对每一条订单记录进行处理后再导出,这是由于数据量过大需要采用10个线程对这10万条数据进行处理,那么导出execel的这个动作或者线程需等待上面10个线程处理完再执行。构造方法:new CountDownLatch(int coun原创 2017-03-29 20:38:44 · 494 阅读 · 1 评论 -
JVM GC算法以及调优
jvm的垃圾回收器是jvm的重要组成部分。GC负责着整个jvm运行时堆中对象的回收,保证jvm的性能。由于Java执行GC垃圾回收时会阻塞其他所有的线程,这样是对用户极不友好的,即对GC的优化重点是降低阻塞的时间,对GC的调优也就是对jvm的性能调优的重点。jvm堆的内存模式(画的比较简陋,忘海涵) jvm为堆内存划分了几块区域如上图: 最左边的new generation是新生代,新生代分为3原创 2017-03-27 23:13:17 · 1437 阅读 · 2 评论 -
java 执行基础运算时内存调度过程
当我们执行i=i+1时;有没有想过i是怎么执行+1操作的,他的过程是什么? 我查过一些资料,虽然不是很深,但还是要分享一下我的理解。jvm的所有运算操作都是要依赖cpu进行的,当java中执行i=i+1时,首先是jvm将i=i+1操作的过程生成cpu能执行的指令,然后cpu来执行i=1+1的操作。cpu将i所在的内存中的值读到高速缓存区中。然后再从高速缓存区读取i的值到主存中。然后cpu执行原创 2017-03-27 16:16:27 · 551 阅读 · 1 评论 -
项目中执行lock.unlock()出现java.lang.IllegalMonitorStateException
项目中代码,这段代码是判断excel是不是正在导出中,并发量只允许为1,因为excel导出很占cpu资源@RequestMapping("excelOrderExportCheck.json") @ResponseBody public AjaxObj excelOrderExportCheck(){ AjaxObj ajaxObj=new AjaxObj(); //防止重复exce原创 2017-03-27 12:21:02 · 11390 阅读 · 2 评论 -
CyclicBarrier 高并发的使用
CyclicBarrier是Java中java.util.concurrent并发包里的一个工具类。作用就是控制多个线程同时等待某个事件的执行才会一起执行。使用场景:多用于多个子线程等待主线程执行完毕后执行的场景。两个重要构造方法:new CyclicBarrier(int)int为等待的线程的个数。 new CyclicBarrier(int,Runnable)Runnable为等待的线程被触发原创 2017-03-19 21:07:11 · 610 阅读 · 0 评论 -
blockingQueue实现消费-生产模式
blockingQueue实为阻塞队列,数据由消费者线程、生产者线程共享。消费者产生数据放入阻塞队列,倘若阻塞队列已满,则生产者线程被阻塞直到消费者线程取出数据或者是直接返回失败,若队列数据为空,则消费者线程阻塞直到生产者线程放入数据或者直接返回失败。且阻塞队列的数据为先进先出的规则。常用apioffer(E e) 向阻塞队列放入数据,倘若阻塞队列已满,则直接返回false。offer(E e,原创 2017-03-19 16:55:12 · 820 阅读 · 0 评论