Java是老牌编程语言,目前拥有广阔的应用空间,Java人才需求也一直占据IT人才总需求的60%以上。很多企业在招聘Java工程师时会考察求职者对分布式系统、高并发知识的理解掌握。接下来小编就给大家简单梳理一下相关知识点。
想要很好的理解并发,我们需要先知道同步与异步的概念。
同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其它的命令。同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行。
异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。异步在一定程度上可以看做是多线程的,请求一个方法后,就不管了,继续执行其他的方法。
处理并发和同同步问题主要是通过锁机制来解决,锁机制有两个层面:代码层次上的,如Java中的同步锁,典型的就是同步关键字synchronized。数据库层次上的,典型的就是悲观锁和乐观锁。
高并发下提高访问效率的常见手段
1)尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
2)用jprofiler等工具找出性能瓶颈,减少额外的开销。
3)优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
4)优化数据库结构,多做索引,提高查询效率。
5)统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
6)能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
7)不要频繁的new对象,对于在整个应用中只需要存在一个实例的类推荐使用单例模式;对于String的连接操作,使用StringBuffer或者StringBuilder;对于utility类型的类通过静态方法来访问。
8)避免使用错误/异常的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要;不要使用 instanceof做条件判断,尽量使用比的条件判断方式;使用JAVA中效率高的类,比如ArrayList比Vector性能好。
9)出现超时的情况,一般说明并发数量已经超过了数据库所能处理的极限,数据库无限等待导致超时,此时建议采用线程池的方案,支付宝的单号就是用的线程池的方案进行的。数据库update不是一次加1,而是一次加几百甚至上千,然后取到的这 1000个序号,放在线程池里慢慢分配即可,能应付任意大的并发,同时保证数据库没任何压力。
解决以上问题后,使用服务器集群来解决单台的瓶颈问题