202111-17 Java并发教程之Callable和Future接口详解 刚把Thread的知识理了一遍。Runnable是一个接口,而Thread是Runnable的一个实现类。所以也就有了之前创建线程的两种方法继承Thread实现Runnable我们看一下新建线程的方法:都是得传入一个Runnable对象(这句话很关键)所以传入一个Runnble和Thread对象都行。现在引入创建线程的第三种方法:Callable为了实现Runnable,需要实现不返回任何内容的run()方法,而对于Callable,需要实现在完成时返回结果的call()方法。... 继续阅读 >
202109-04 分析python并发网络通信模型 目录一、常见模型分类1.1、循环服务器模型1.2、IO并发模型1.3、多进程/线程网络并发模型二、基于fork的多进程网络并发模型三、基于threading的多线程网络并发四、ftp文件服务器4.1、项目功能4.2、整体结构设计五、IO并发5.1、IO分类5.2、IO多路复用5.3、位运算5.4、poll方法实现IO多路复用5.5、epoll方法一、常见模型分类1.1、循环服务器模型循环接收客户端请求,处理请求。同一时刻只能处理一个请求,处理完毕后再处理下一个。... 继续阅读 >
202108-26 解析java中的condition 目录一、condition介绍及demo二、Condition接口 三、condition实现分析3.1、等待队列3.2、等待3.3、通知一、condition介绍及demoCondition是在java1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Conditi... 继续阅读 >
202108-26 分析java并发中的wait notify notifyAll 目录一、前言二、常见的同步场景2.1、设置一个判断的标志位2.2、线程的join方法2.3、使用闭锁CountDownLatch2.4、利用wait/notify优化标志位方法三、理解wait/notify/notifyAll3.1、锁池3.2、等待池3.3、notify和notifyAll的区别3.3.1、wait()3.3.2、notify()3.3.3、notifyAll()四、生产者与消费者模式五、总结一、前言java面试是否有被问到过,sleep和wait方法的区别,关于这个问题其实不用多说,大多数人都能... 继续阅读 >
202108-25 详解Java并发编程基础之volatile 目录一、volatile的定义和实现原理1、Java并发模型采用的方式2、volatile的定义3、volatile的底层实现原理二、volatile的内存语义1、volatile的特性2、volatile写-读建立的happens-before关系3、volatile的写/读内存语义三、volatile内存语义的实现1、volatile重排序规则2、内存屏障3、内存屏障示例四、volatile与死循环问题五、volatile对于复合操作非原子性问题一、volatile的定义和实现原理1、Java并发模型采用的方式a)线... 继续阅读 >
202108-23 详解Java多线程与并发 目录一、进程与线程二、并发与并行1、线程安全问题2、共享内存不可见性问题三、创建线程1、继承Thread类2、实现Runable接口3、实现Callable接口四、Thread类详解1、线程特性2、Init方法3、构造方法4、线程状态5、Start方法6、yield方法7、sleep方法8、join方法五、其他方法1、wait方法2、notify方法3、notifyAll()方法六、实例1、sleep2、join和中断(推荐用标记中断)3、优先级和守护进程4、生产者与消费者一、进程与线程进程:是... 继续阅读 >
202108-08 浅谈JAVA并发之ReentrantLock 目录1.介绍2.源码剖析2.1上锁(获取资源)2.2释放资源2.3公平锁与非公平锁的区别1.介绍结合上面的ReentrantLock类图,ReentrantLock实现了Lock接口,它的内部类Sync继承自AQS,绝大部分使用AQS的子类需要自定义的方法存在Sync中。而ReentrantLock有公平与非公平的区别,即'是否先阻塞就先获取资源',它的主要实现就是FairSync与NonfairSync,后面会从源码角度看看它们的区别。2.源码剖析Sync是ReentrantLock控制同步的基础。... 继续阅读 >
202107-22 nginx+lua单机上万并发的实现 nginx是我们最常用的服务器,常用于做内容分发和反向代理,lua是一种类C的脚本语言,广泛应用于游戏行业,十年前页游流行的时候,我曾经买过传奇类游戏的源码,游戏中的服务端就是用lua实现的。我们常用来配合nginx、envoy和redis做一些简单实用的功能,比如:超卖和少卖、排行榜等,减少请求到达后端java的频率下面开始构建nginx+lua的镜像,自己构建的原因是怕别人提供的镜像里有病毒,docker非官方镜像中有很多病毒,这一点大家... 继续阅读 >
202107-21 浅谈Swoole并发编程的魅力 目录场景介绍并发编程编码实现并发难题数据同步问题思维转变场景介绍假设我们要做一个石头剪刀布的Web游戏,3个玩家同时提交竞猜后显示胜者。在传统串行化Web编程中,我们一般思路是这样:设置form表单,用户提交竞猜后保存到MySQL/Redis存储添加一个查看结果按钮,如果未全部完成,显示正在等待其他人提交。当3个人全部提交时,查询存储,并显示最终结果并发编程这个场景就可以使用Swoole实现并发编程,无需依赖MySQL/Redis存储,... 继续阅读 >
202107-16 详解PHP服务器如何在有限的资源里最大提升并发能力 目录概述服务器数据库注册登录提交表单总结概述假设报考app是用5Wrmb向供应商采购,报名当天涌入海量考生,并发数飙升至30W+,导致系统宕机,拒绝服务,致使考生无法报名,那么5Wrmb能否支持30W+并发呢?不过对于我们来说,不妨把问题上升一个角度:「如何在有限的资源里最大提升服务器并发能力」。假设你是一名技术负责人,你在面对一个并发量较大的项目时会如何设计和架构呢?首先我们可以针对这个项目捋一下大体的思路,从... 继续阅读 >
202107-08 JavaScript 中如何实现并发控制 目录一、并发控制简介1.1阶段一1.2阶段二1.3阶段三二、并发控制的实现2.1asyncPool的使用2.2asyncPoolES7实现2.3asyncPoolES6实现三、阿宝哥有话说3.1手写Promise.all3.2手写Promise.race四、参考资源一、并发控制简介假设有6个待办任务要执行,而我们希望限制同时执行的任务个数,即最多只有2个任务能同时执行。当正在执行任务列表中的任何1个任务完成后,程序会自动从待办任务列表中获取新的待办任务并... 继续阅读 >
202103-10 详解go语言的并发 1、启动go语言的协程packagemain import( "fmt" "runtime") //runtime包 funcmain(){ //runtime.Gosched()用于让出cpu时间片,让出这段cpu的时间片,让调度器重新分配资源 //写一个匿名函数 s:="test" gofunc(sstring){ &nbs... 继续阅读 >
202102-21 C# List 并发丢数据问题原因及解决方案 项目中出了个BUG,就在我眼皮子底下,很明显的一个BUG,愣是看了两天才看出来。我有多个任务并发,任务执行完成后都有一个返回结果,我用一个List将结果收集起来,等所有任务完成后,发送出去。结果一直丢数据。我反复检查逻辑都没有问题,最后恍然List是非线程安全的。大家都知道List是非线程安全的,但是如果仅有Add操作呢?估计有些人就会认为没问题。下面的代码,期望输出的结果是1000,然而,注释掉lock后,结... 继续阅读 >
202102-01 MySQL 加锁控制并发的方法 前言锁总体可以分为乐观锁和悲观锁,简单说,乐观锁用版本号控制,悲观锁用锁控制。下面是待会要用来测试的数据#添加一个user表CREATETABLE`users`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'ID',`name`varchar(255)NOTNULLCOMMENT'姓名',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;#插入3条数据INSERTINTO`users`(`id`,`name`)VALUES(1,'雪山飞猪'),(2,'chenqionghe')... 继续阅读 >
202012-22 golang gin 框架 异步同步 goroutine 并发操作 goroutine机制可以方便地实现异步处理packagemainimport("log""time""github.com/gin-gonic/gin")funcmain(){//1.创建路由//默认使用了2个中间件Logger(),Recovery()r:=gin.Default()//1.异步r.GET("/long_async",func(c*gin.Context){//需要搞一个副本copyContext:=c.Copy()//异步处理gofunc(){time.Sleep(3*time.Second)log.Println("异步执行:"+copyContext.Request.URL.Path)... 继续阅读 >
202012-15 python 实现socket服务端并发的四种方式 多进程&多线程服务端:多进程和多线程的开启方式相同。缺点:<1>由于Cpython的GIL,导致同一时间无法运行多个线程;<2>不可能无限开进进程或线程解决办法:多进程、concurrent.futures.ProcessPoolExecutor、线程池importsocketfrommultiprocessingimportProcessfromthreadingimportThreadclassMyTcpServer:def__init__(self,ip,port):self.ip=ipself.port=portself.server=socket.socket()s... 继续阅读 >