线程池的陷阱 使用线程池要小心,一不小心就会导致程序挂死。举例说明这种情况。 线程池中有一个同步队列存放数据,多个线程取队列中的数据去处理,数据的类型可能有多个,所以每种数据类型对应一个处理函数,假设某种数据的处理函数会把线程阻死,这时就悲剧了,这个阻死会蔓延到线程池的所有线程,最后线程池中所有的线 ...
分类:
编程语言 时间:
2019-12-21 12:11:33
阅读次数:
96
内存中的堆和栈 堆: 是程序员手动申请的空间,空间用完需要程序员自己手动释放,也可能会由OS回收,分配方式类似链表; 堆比较大,地址向上增长; 堆一般存放对象 栈: 是系统申请的空间,空间用完系统会自动释放; 栈比较小,地址向下增长; 栈一般存放局部变量 数据结构中的堆和栈 堆: 可以看做一颗树,比 ...
分类:
其他好文 时间:
2019-12-20 18:58:12
阅读次数:
118
AQS AbstractQueuedSynchronizer抽象资源队列同步器,用于实现任务对于资源获取的同步功能。 几个要点: 资源:state,int计数 等待线程:Node,等待线程队列 线程阻塞:Unsafe.park() 获取和释放资源通过操作state实现,为0则代表资源空闲。 ...
分类:
其他好文 时间:
2019-12-20 18:29:35
阅读次数:
65
1,登陆账号,链接上服务器。 2,取账号权限 3,(分析器)分析sql,是否符合语法。表名,是否存在,涉及表字段是否正确等等 4,(优化器)优化sql,是否需要使用索引。多个索引存在的情况下,哪个索引最合适。join 链接查询的话,先从哪个表开始比对等等 5,(执行器)查看是否有搜索涉及表的权限。执 ...
分类:
数据库 时间:
2019-12-20 17:02:08
阅读次数:
180
/** * ReentrantLock使用Condition对象来实现wait和notify的功能* 使用Condition时,引用的Condition对象必须从Lock实例的newCondition()返回,这样才能获得一个绑定了Lock实例的Condition实例* Condition提供的aw ...
分类:
其他好文 时间:
2019-12-20 15:31:11
阅读次数:
99
前言 前两篇我们讲述了ReentrantLock的加锁释放锁过程,相对而言比较简单,本篇进入深水区,看看ReentrantReadWriteLock-读写锁的加锁过程是如何实现的,继续拜读老Lea凌厉的代码风。 一、读写锁的类图 读锁就是共享锁,而写锁是独占锁。读锁与写锁之间的互斥关系为:读读可同时 ...
分类:
其他好文 时间:
2019-12-19 23:12:58
阅读次数:
70
AbstractQueuedSynchronizer简称为AQS,AQS是ReentrantLock、CountdownLatch、CycliBarrier等并发工具的原理/基础,所以了解AQS的原理对学习J.U.C包很重要。 基本原理: 1.AQS中包含两种队列(FIFO),同步队列+条件队列,底 ...
分类:
编程语言 时间:
2019-12-19 19:27:05
阅读次数:
69
定义一个lock接口 lock的实现类 此处wait()的是this对象,sychronized的也是this对象 测试类 缺点:如果在线程执行过程中锁被main线程释放,不能保证 线程加的锁被线程自己释放 改进方法 ...
分类:
其他好文 时间:
2019-12-19 16:30:46
阅读次数:
106
USES_CONVERSION它是在堆栈上分配空间的,也就是说你在你在函数未结束就不会被释放掉。所有要注意不要在一个函数中用while循环执行它,不然栈空间就马上会分配完(栈空间一般只有2M,很小)。 不用宏的简单方法 方法二: CString(szEnUrl.c_str()); //可以将stri ...
分类:
其他好文 时间:
2019-12-19 16:04:57
阅读次数:
119
僵尸进程: 每个进程结束以后会释放所占用的资源,但是还是会保留少许的状态资源以供其父进程查看子进程曾经运行时候状态。 一旦父进程通过wait()或者waitpid()检查了子进程曾经运行的状态,内核就会释放子进程占用的资源。 如果子进程已经结束运行,但是父进程还在运行。则这个时候子进程就会变为僵尸进 ...
分类:
系统相关 时间:
2019-12-19 14:39:41
阅读次数:
109