这段时间在Code Review之余负责一个处理大数据量程序的正常运行。本应该是国庆之前完成的事,但因对程序处理能力的认识不足就拖到了现在。程序由单线程改造为并发,并因此修改当初的设计,后来针对出现的问题做持续的处理及优化。下面列出在完成这个任务时所想到的及问题总结
1. 由使用并发看到的
在处理大数据量任务时,可以做到的要么提高执行效率,要么并发执行。如果在单线程效率达到瓶颈时,不得不引入并发,并面对随之而来的问题。在我的程序中,多线程删除某个目录下的所有文件,或是多线程往同一文件中写数据,都得考虑同步时的争锁问题。
- 线程数量有阈值,并不是越多越好。因应用而定,对共享的争用是需要权衡的。
- 设置条件,减少多线程进入同步块的机会。如每条线程执行500条数据,才去检查共享目录的文件。
- 在频繁出现资源争用的情况时,为不同线程设置不同的sleep时间,错开执行。
2. 持续优化可以确定的性能瓶颈
优化绝对是建立在对已有程序执行效率的分析结果上。在我的程序中经历的优化有:在单线程性能已无法提高时,选择多线程 --> 解决线程争用共享资源 --> 排除很多无效数据也要下载文件且占据网络资源的情况 --> 解决部分数据依赖于第三方jar包,长时间没有数据返回的问题等。优化之前在可能出现性能问题的地方设置时间点,分析执行时间,以执行时间为依据做代码review。
3. 让程序更聪明些
在程序运行期,我们希望得到它的执行进度、效率、指出程序瓶颈在哪,更期望程序从主动从问题中恢复,这些要求在程序开发阶段不会考虑太全,需要经过实践的验证,并不断补充。这个问题以前就认识到,但要写出些能上得了台面的东西,还是需要不断积累。
- 在网络超时,系统负载高的时候能减缓执行,反之加快执行速度。
- 如果某些资源在使用一段时间后频繁出现访问延时,就每隔一段时间重启执行程序。
- 分析每个线程的执行效率,或分析线程数量的较优解
- ... ...
4. 对BufferedWriter的并发访问
程序中多线程往同一文件中写数据,使用BufferedWriter。之前没有看过BufferedWriter的代码,在访问BufferedWriter之前做同步处理,并在每次append()之后都做flush()操作,造成程序性能损耗严重。在同事的提醒下,修正为每个线程执行N次后再做flush。
看了下BufferedWriter的代码,对上面的两个问题的解释:
1. 多线程访问BufferedWriter是否需要同步
BufferedWriter自带锁,同步对流的访问,所以在外面的同步可要可不要。(append同write方法)
protected Object lock;
public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
}
2. 如果append后不做flush,谁来flush
BufferedWriter自设缓存,且默认大小为8K,大小可修改。
private char cb[];
private static int defaultCharBufferSize = 8192;
public void write(int c) throws IOException {
synchronized (lock) {
ensureOpen();
if (nextChar >= nChars)
flushBuffer();
cb[nextChar++] = (char) c;
}
}
在往BufferedWriter写数据时,当它发现缓存已满,就将缓存数据写入流中,将新到的数据再次放入缓存中。也就是说如果程序不主动flush的话,当数据值积累到默认缓存大小时,BufferedWriter会自动将缓存数据flush入writer流中。
还有,当BufferedWriter关闭的时候,也会把所有缓存数据自动flush.
public void close() throws IOException {
synchronized (lock) {
if (out == null) {
return;
}
try {
flushBuffer();
} finally {
out.close();
out = null;
cb = null;
}
}
}
分享到:
相关推荐
【文档标题】与【描述】并未提供具体的技术性或IT相关的信息,而是关于人生感悟的散文随笔。因此,从这些信息中无法直接提取出IT行业的知识点。但是,如果我们将这些人生哲理与IT行业相结合,可以衍生出一些关于工作...
这篇文档实际上是对个人学习生活感悟的总结,虽然标签为"方案",但内容更偏向于个人体验和情感表达。从这段文字中,我们可以提炼出以下几个与学习、生活和自我认知相关的知识点: 1. 学习环境的影响:作者提到在...
【标题】:人生随笔六篇 - 感悟人生的散文随笔精选 【标签】:资料 【主要内容】:本文由六篇散文随笔组成,主题围绕着人生的感悟和体验,探讨了幸福、压力、适应、释放、微笑以及面对困难的态度。作者通过比喻...
工作随笔:一瞬间的心动 作为一名教育工作者,我时常在忙碌的教学日常中体会到一种特殊的触动。这种感动并非来自华丽的辞藻或震撼的场景,而是在平凡的工作中,与家长们的每一次沟通、每一次理解中逐渐积累起来的。...
【校长信息化学习感悟总结】 信息化时代的教育领导力不仅关乎技术的应用,更关乎教育者的情感态度和价值观念。校长作为学校教育的领航者,其信息化学习的感悟与实践对于整个教育体系的影响深远。孙召校长的随笔揭示...
3. 平衡与和谐:世间万物追求平衡,一旦失去平衡,生活就会出现问题。过分关注回报或结果可能导致心理失衡,而不计回报的付出则可能带来意想不到的惊喜和收获。 4. 无私与高尚:无私和无贪念的态度可以防止罪恶接近...
文章中提到一位教师准备了专门的反思记录本,记录日常教学中的点滴感悟。这体现了积极态度在反思过程中的重要作用。只有保持乐观向上的态度,教师才能在面对困难和挑战时,找到解决问题的方法,并从中汲取教训,实现...
《老年感悟生活散文随笔:人到老年》以一篇篇细腻的笔触,描绘了老年人对生活的深刻认知与自我接纳,展现了一幅幅经过岁月沉淀的智慧画卷。 随着年纪的增长,老年人开始深刻感受到生命的有限性,这种对时间的珍视让...
在一篇名为《【学校老师训练感悟随笔-持一颗感恩之心】 心怀一颗感恩之心》的随笔中,我们可以窥见教师在教育实践中关于感恩教育、教育反思、家校合作与教师角色定位等方面的深刻感悟。 首先,感恩教育的价值在随笔...
而随笔则更为随意,通常是作者对某一主题的即时感悟,篇幅短小,但富有哲理。 2. **黄牛的写作特色**:虽然没有具体信息,但我们可以推测黄牛可能以其独特的视角、深刻的人生洞察力或是生动的叙述技巧著称。他的...
事业编的工作环境相对稳定,但同时也意味着需要不断适应新的工作要求和环境的变化。在这样的环境中,持续学习和提升自身能力是职业发展的不二法门。然而,恐惧失败的心态往往会成为进步路上的绊脚石。这时候,我们...
标题“在笑声中飞走劳累”暗示了作者试图探讨如何通过愉快的教学氛围减轻教师的工作压力,同时增强幼儿的学习乐趣。教育随笔是一种个人观察、反思和经验分享的形式,通常包含对教育理念、教学方法和师生互动的深度...
在IT学习中,这种自我驱动和独立解决问题的能力是成功的关键。技术问题往往需要通过自主研究和不断实验来解决。只有这样,我们才能在IT领域中不断进步,成就卓越。 此外,“越优秀的人越努力”这一观念同样适用于IT...
通过阅读这些随笔,读者可以学习如何用文字捕捉生活中的点滴感动,如何用细腻的情感描绘人物和场景。这对于提高写作技巧,尤其是散文写作,具有重要的启发和借鉴意义。 最后,【小忆故乡随笔】也是一次心灵的旅行。...
【标签】中的“事业编”可能指的是这篇随笔是作为某项工作、学习任务的一部分,或者与个人职业发展或事业编制考试有关,强调了阅读对于个人成长和事业发展的重要性。 【部分内容】中提到了阅读对作者个人生活和学习...
总而言之,这些高中随笔不仅展示了学生们日渐成熟的写作技巧,也透露出他们对生活的深刻感悟和对自我的深度思考。通过这些文字,我们可以感受到青春的激情、对未来的憧憬和对生命意义的追求。无论是在文学表达、哲学...
【标题】"散文随笔_生活三部曲散文随笔.rar"所指的是一份包含散文随笔作品的压缩文件,特别关注的是生活的主题。在IT领域,这可能涉及到电子书、数字出版或个人资料存储等方面的知识。"rar"是一种常见的文件压缩格式...
随笔通常是对教学实践的反思和感悟,是教师自我提升和教学经验分享的重要方式。这里的“中小学”意味着内容将涵盖小学到初中的语文教学,可能涉及不同年龄层次学生的特点和教学策略。 【描述分析】 描述与标题相同...
【教师春节随笔又到一年敬业福】这篇文章的标题与教育行业相关,尤其可能是教育工作者在春节期间对于敬业精神的反思和感悟。春节是中国的传统节日,是家人团聚、放松的时刻,但教师们往往在这个时候也需要保持敬业...