Java
文章平均质量分 90
GoodLinGL
这个作者很懒,什么都没留下…
展开
-
高并发的处理策略
并发、并行及高并发 并发:同一时刻中,只有一个线程在执行,交替执行不同的任务。 并行:在同一时间内,有个多线程在执行。同一个时间点上有多少个任务在执行,这个执行的数量叫做并发度。 高并发:在同一时间,有大量用户同时访问同一个URL,容易导致服务器和数据库资源被占满崩溃,数据库的存储和更新结果跟理想不一致,例如出现重复的数据记录,多次添加记录等数据错乱问题。 多线程:多线程是Java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,Java提供了这种多线程的机制,以增强数原创 2021-03-29 10:57:25 · 369 阅读 · 1 评论 -
微信抢红包的设计
抢红包 一个“秒杀”活动,对应 DB 中的一条库存记录。当用户进行商品“秒杀”时,系统的主要逻辑在于 DB 中库存的操作上。一般来说,对 DB 的操作流程有以下三步: 锁库存 插入“秒杀”记录 更新库存 “秒杀”系统的设计难点就在这个事务操作上。商品库存在 DB 中记为一行,大量用户同时“秒杀”同一商品时,第一个到达 DB 的请求锁住了这行库存记录。在第一个事务完成提交之前这个锁一直被第一个请求占用,后面的所有请求需要排队等待。同时参与“秒杀”的用户越多,并发进 DB 的请求越多,请求排队越严重。因此,转载 2021-03-28 22:38:10 · 2266 阅读 · 1 评论 -
栈上分配与TLAB
栈上分配与TLAB栈上分配为什么需要栈上分配什么是栈上分配栈上分配如何开启TLAB为什么需要TLAB什么是TLAB对象内存分配的两种方法 一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以及TLAB。 栈上分配 为什么需要栈上分配 在JVM中,堆是线程共享的,因此堆上的对象对于各个线程都是共享和可见的,只要持有对象的引用,就可以访问堆中存储的对象数据。虚拟机的垃圾收集系统可以原创 2021-03-28 16:54:39 · 421 阅读 · 0 评论 -
高并发无锁实现CAS原理
在多线程高并发编程的时候,最关键的问题就是保证共享对象的安全访问。通常是用synchronized 来处理,其实加锁本质上是将并发转变为串行来实现的,势必会影响吞吐量。 而最高效的做法就是不加锁,那就是CAS,Compare and Swap即比较并替换,设计并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧神工的实现了多线程执行的安全性。 没有CAS就不会有并发包,synchronized是一种独占锁、悲观锁,java.util.concurrent中借助了CAS原创 2021-03-28 13:12:42 · 442 阅读 · 0 评论 -
线程池
线程池什么是线程池线程池的工作原理线程池的作用线程池中核心线程数量大小怎么设置线程池为什么需要使用(阻塞)队列线程池为什么要使用阻塞队列而不使用非阻塞队列几种常见的线程池及使用场景单机上一个线程正在处理服务,如果忽然断电了怎么办(正在处理的请求和阻塞队列里的请求怎么处理)线程池中线程复用原理线程池状态ThreadPoolExecutor 有哪些常用的方法 什么是线程池 线程池是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使原创 2021-03-27 23:25:29 · 141 阅读 · 0 评论 -
阻塞队列和非阻塞队列
在并发队列上JDK提供了一些应用比较广泛的特殊队列:一种是以ConcurrentLinkedQueue为代表的非阻塞队列;另一种是以BlockingQueue接口为代表的阻塞队列。通过这两种队列,我们保证了多线程操作数据的安全性。 阻塞队列 阻塞队列是一个支持两个附加操作的队列:1)在队列为空时,获取元素的线程会等待队列变为非空;2)当队列满时,存储元素的线程会等待队列可用。因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被堵塞,除非有另一个线程做了出队列的操作;同样,当一个线程试图对一个原创 2021-03-27 21:20:42 · 605 阅读 · 0 评论