
并发
kobexzf
这个作者很懒,什么都没留下…
展开
-
活跃性
活跃性:一个并发应用程序能及时执行的能力死锁:数据库能检测处理,根据wait-for graph去rollback undo量最小事务,但java里没法处理,只能终止程序用一致的顺序获取锁,如先A后B动态锁顺序死锁:先加参数1,再加参数2,调用方传参顺序任意,这种可以先加hashcode小的参数,再加大的。协作对象产生死锁:加多个锁的代码跨越了方法甚至对象,考虑开放调用(不要在已有锁的状态...原创 2019-01-10 17:33:59 · 514 阅读 · 0 评论 -
性能/可伸缩性
先考虑代码的正确,安全,再考虑性能(用更少资源做更多事情)。利用现有资源,出现新的资源能否利用,尽可能保持cpu有效忙碌性能两个方面:快(服务,延迟时间)多少(处理能力,吞吐量像qps或tps这种,可伸缩性),服务器应用关注的重点可伸缩性:增加资源(cpu,内存等),吞吐量能否相应增加,这方面调优考虑计算并行化多快和多少之间的矛盾:如分层架构,对单个任务执行更慢(执行过程分解,任务排队...原创 2019-01-11 16:15:17 · 360 阅读 · 0 评论 -
显式锁
显式锁:高级功能,轮询,定时,中断,公平性: 非公平发出请求时锁可用可以直接抢,否则也要排队,公平的只要锁不可用或前面有人就去排队公平性很好,但没必要,而且会带来性能问题(挂起和恢复线程的开销,恢复线程到线程真正运行有不少延迟,非公平锁在这段时间内可让其他线程可完成加解锁操作),统计上的公平性保证(线程最终能获得锁)就好了非块结构(不基于代码块,加锁解锁可能不在同一栈帧),千万不要忘记在fin...原创 2019-01-11 19:43:17 · 280 阅读 · 0 评论 -
线程安全/发布
线程安全类:多线程访问不需客户端额外同步或协同(类里封装了同步机制),类总能表现正确行为无状态 类一定线程安全,一个变量可考虑原子变量,两个且两个构成不变性条件呢?多个变量的不变性条件,所有变量需同一锁保护。发布 发布可能导致其他对象发布(如Set,非private域)安全发布:保证能看到引用和状态的一致性,两者同时对其他线程可见,能否及时看到引用clinit,volatile,Atom...原创 2019-01-07 15:53:23 · 168 阅读 · 0 评论 -
并发构建
同步容器:性能和复合操作问题,cme问题ConcurrentModificationException: 使用iterator时,其他线程修改容器,fail-fast,抛出此异常,导致我们需迭代过程加锁(可能导致性能问题)或克隆容器进行迭代,而且还有很多隐式的迭代(如sysout一个set)。并发容器:性能好,一般无cmeConcurrentHashMap 分段锁(任意线程读,一些线程写,读...原创 2019-01-07 19:12:58 · 145 阅读 · 0 评论 -
自定义同步工具
状态依赖:并发程序中,其他线程可能改变状态使本线程可以解除阻塞并执行状态变量构成前提条件,获取锁的情况下测试前提条件,不满足阻塞(释放锁让其他线程获取锁并改变状态),醒来再获取锁测试前提条件直到成立不满足前提条件调用者...原创 2019-01-14 20:40:48 · 153 阅读 · 0 评论 -
任务/线程池等
考虑单线程和一个任务一个线程的不足(线程创建销毁开销,对资源的竞争)Executor 异步,任务提交和执行解耦,考虑执行策略, 任务独立且同构这样才能发挥并发执行的威力线程池:0-core,队列,core-max,reject,没有prestartCoreThread或prestartAllCoreThreads开始没有线程放入队列无阻塞offer(),worker thread从队列取 当...原创 2019-01-09 20:50:44 · 144 阅读 · 1 评论 -
原子变量和非阻塞同步
volatile无法构建原子的复合操作如i++优先级反转(高优先级线程无法运行,在等低优先级当前持有的锁)我们希望:volatile语义,原子更新,但不像锁那么大的开销cas失败:其他线程修改了内存值cas看上去代码不少(处理竞争失败的问题,比如重试,放弃等),但实际相对锁的代码路径短(看上去简单,但有很多jvm代码和操作系统代码),即便是无竞争的锁其开销也大于cas,可估算为2倍原子变...原创 2019-01-15 20:38:25 · 170 阅读 · 0 评论