1.背景 用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作;如果没有存在,那么执行insert操作代码逻辑: 线程启动后,发现:数据库表中有两条oderid相同的记录 通过查看日志发现: 两个 ...
一 背景 用多线程接收推送的订单数据,把接收的订单数据存到一个表中。 实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作 如果没有存在,那么执行insert操作代码逻辑: 线程启动后,发现:数据库表中有两条oderid相同的记录。 通过查看日志发现: 两个线程相差时间极端,各自收到了同一个订单的推送消息,在执行数据库insert或update时,都判断出该订单在数据库表中 ...
2021-02-03 17:43 0 321 推荐指数:
1.背景 用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作;如果没有存在,那么执行insert操作代码逻辑: 线程启动后,发现:数据库表中有两条oderid相同的记录 通过查看日志发现: 两个 ...
背景介绍 通常我们在接口里要保存一条数据时,会先判断该条记录在数据库里是否存在,如果不存在就插入,如果存在就返回已经存在。 就拿常见的工单来举例 在单线程下这么写肯定没问题,但是如果是并发情况下,很有可能会同时插入多条记录进数据库。 解决方案 1.数据库设计表的时候给工 ...
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。 如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。 ...
异步是什么? 这里就不拿官方的解释来解答了,只以个人理解来回答问题,轻喷。我们知道JavaScript是单线程的,不像java等语言是多线程的,所以一般情况下,js代码是一行一行的执行的。但是某些时候需要用异步来提升性能,比如说一个网络请求需要服务端返回数据30s,js不可能 ...
死锁发生的条件 互斥条件:就是一个资源只能有一个进程占有,不可以被两个或者多个进程占有 不可抢占条件:进程已经获得的资源在未使用完之前,不可以被抢占,只能在使用完之后自己释放 占有申请条件:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放 ...
GC就是Java的垃圾回收机制,要了解什么情况下会发生GC(即GC得触发条件),我们需要先了解JVM的内存模型结构,之前一篇文章已经详细讲解了Jvm的内存模型结构,而通常来说,GC主要针对的是堆(java heap)区。 而java heap是分代的(年轻代和老年代),为什么要分代 ...
首先创建一个person表: create TABLE `person`( `id` int not null auto_increment, `name` VARCHAR(255) ...
Young GC的触发时机:Young GC其实一般就是在新生代的Eden区域满了之后就会触发,采用复制算法来回收新生代的垃圾。 Full GC的触发时机如下: (1)发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象 ...