本期名家
说明: C:\Users\jsj\AppData\Roaming\Tencent\Users\165075460\QQ\WinTemp\RichOle\[E@EBRXB[G8(4_63MW(G_35.png
高红岩

   某世界500强企业高级项目经理,10余年项目管理与开发经验,10年Java相关开发经验,深谙Java技术开发难点与要点,拥有良好的技术素养和丰富的实践经验。精通J2EE核心技术、基于EJB的分布式系统开发、Android移动开发、智能报表、多线程及高并发等相关的技术内容,近期继续关注并发相关的前沿技术。著有《Java多线程编程核心技术》《Java并发编程:核心方法与框架》,喜欢将技术与教育相结合的方式共享知识,得以共同提高。生活中喜欢摄影, 对轮滑,旅游,航模亦兴趣浓厚。

互动访谈
1、能否简单解释下多线程、并发和并行的关系?
线程Thread其实就是操作系统里进程中独立运行的子任务,使用多线程的主要目的就是充分利用多核CPU的优势,使每个CPU核参与到任务的处理的,这时在多核的环境中使用多线程就很有必要了。但线程运行的轨迹在默认的情况下就像打开潘多拉的魔盒一样,所有的怪物被释放,进入了灾难,在对多线程的开发,调试时也是非常不方便,但好在还是有一些解决方案可以避免这样的情况发生,比如使用synchronized,Lock以及Java并发包中提供的若干工具类。 并发concurrency的含义是指在不同的时间段内有多个任务进行切换式的被处理器执行,比如在做电商类的项目时着重要考虑系统的并发量,这对于系统的入口吞吐量起到决定性的作用。而并行Parallelism其实主要就是指在同一时间内有多个任务同时在不同的CPU核中被运行,并行参数也对系统运行的效率进行影响。
2、Java并发常见于什么场景?常见的哪些应用或者框架其实用的是Java 并发处理技术?
Java并发的场景随处都是,比如高并发的订单处理,游戏设计中通过并发的特性解决复杂逻辑问题,工业控制系统ICS中的数据采集等等,都是并发的场景,如果不学习Java并发那么在面对复杂的业务逻辑,设计高性能的服务器时就有可能绕一些弯路,其实解决方案已经在Java并发中存在了。 学习Java多线程与并发完全有助于理解高性能的NIO框架Netty,使NIO与多线程和并发技术进行结合,开发高效运行的服务器,有助于学习高性能的RPC框架zeroc ice,Dubbo等等,这些技术并不属于web,而是大型项目中举足重轻的底层设计,如果没有这些技术做为支撑,那么谈何高性能,高效率呢。
3、Java并发学习过程中要突破哪些难点?有没有一些值得推荐的路线和方法?
并发的学习其实最难突破的是多线程的基础知识,并发的实现是对线程技术进行二次封装,形成更加方便使用的工具类,如果没有扎实的多线程技术知识,那么学习并发将会比较麻烦,至少在遇到某些问题不得其解,因为多线程的特性还是比较随机,不具有确定性的。建议大家如果真的想掌握Java并发的学习,一定要先打好Java多线程的知识,没有这个做为打底,并发学习的道路其实并不是太顺利。
4、我们知道,在Java并发中,锁的使用一直是难点,能讲一讲这方面相关的知识吗?
不管是synchronized还是Lock,本质上其实还是使线程"听话",使线程执行的轨迹变得让程序员具有预知性,在学习的重点一定要关注锁的是谁?有很多朋友学习锁时并不知道锁定的是什么,在Java中,锁的永远是对象,具体是什么对象,那就是具体代码具体分析了,所以学习锁时这点一定要有所区分。 知道了这个技术后下一步就要学习一下free-lock技术,大家可以关注一下Java并发包中的AQS队列的实现,研究一下里面的原理,对理解Java并发框架有非常大的优势。
5、用Java做一个大流量、高并发的网站应该怎么样进行底层架构?要考虑哪些内容?
具体架构要根据不同的业务来具体分析,世界上没有通用的架构,只有针对某一个具体场景,具体意图来产生出来的架构,并且还要根本业务的变改进行升级。 在高并发的网站设计上,单从代码这块来讲,我认为应该对模块进行拆分,以每服务每应用的分拆思想对整体项目进行组织。优化动态数据的查询,并对静态页面以及静态数据进行缓存处理。对数据表结构进行优化倾向型设计,在数据冗余与效率之间达到一个平衡。使用开源的RMI高性能通讯框架,并结合实际情况将NOSQL技术进行溶入,增加系统的横向扩展功能等。
6、当我们设计Java并发访问系统时,规模不同,处理的问题也不同,如要设计访问量10万和1000万的软件项目,在技术处理上要着重考虑什么?
其实访问量这样的数据单从处理的关键点其实是在"瓶颈"这块!Java开发的小伙伴们经常遇到系统性能提升不上去的情况,反复进行代码修改也无济于事,其实归根到底就是不知道在哪里耗时,哪些耗时的任务在进行时间的累加突显效率很差,当小伙伴们找到原因的所在时能否自行设计解决方案来替换Java并发包中的方式,而大幅提升效率,这些都是开发服务器端程序员要考虑的问题,只要时时关注算法的优化,性能瓶颈的位置,我想系统的并发量一定会大幅提升。 一个再小型的项目也一定有机会做大,所以在技术处理上我一直本着预留扩展的方式对未来系统的扩容留有余地,模块的设计进行分层隔离,日志对性能的影响等等这些也要在考虑之内。记住不到最后,不要性能不够用时以加服务器的方式来提升性能。
7、在并发处理上,您能否对比下 Go语言和Java,比如优缺点和应用场景等?
每种技术都有各自的优点,Go语言完全就是针对高并发的环境进行设计的,语言简单,布署简单,运行环境配置不复杂,所以此语言处理这种场景绝对非常得心应手,。Go语言虽然处理这个情况非常拿手,但不可否认的是,它的生态圈真的非常的单调,不像Java的可选框架随处参考,使用同一语言的优势就是通讯时不需要考虑一些兼容性,如果考虑团队在技术上统一性建议使用Java并发技术来进行服务器的设计,在Java并发性能达到极限,不够用时再考虑其它的语言,比如Go。Java语言是各方面都非常平衡的编程语言,由于发展多年,在稳定性上也有保证,而Go仅仅适用于解决一些性能瓶颈的问题,使用Go来攻关一些难点就是其使用的必要。
相关图书推荐
其他专题推荐
  • Cocos官方首批认证CVP,是国内建立完整的Cocos2d-x学习知识体系的第一人。

  • 中国人工智能学会理事、百度百科学术委员、51CTO学院讲师。

名家名作
关注微信
喜欢读书的朋友请扫我
也可以加我们的
QQ群342347198
联系我们
  • 负责人 林淋
  • 电话: 010-68476606-8185
  • 邮箱: sunsj@51cto.com
  • Q Q:3132396579
Copyright©2005-2015 51CTO.COM 版权所有 未经许可 请勿转载