我之前学习并发编程,里面的案例都是关于Java SE部分的,比如Executor,fork/join,这类的并发包,可是在web里面怎么使用呢?在web里面使用高并发显然不会像Java SE里面一样。
ä¸ã并åæ¯ä¸ç§éæ±ï¼ä»¥ä¸å ä»ç»ä¸ä¸javaweb对äºé«å¹¶åçå¤çæè·¯ï¼
1ãsynchronized å ³é®å
å¯ç¨æ¥ç»å¯¹è±¡åæ¹æ³æè 代ç åå éï¼å½å®éå®ä¸ä¸ªæ¹æ³æè ä¸ä¸ªä»£ç åçæ¶åï¼åä¸æ¶å»æå¤åªæä¸ä¸ªçº¿ç¨æ§è¡è¿æ®µä»£ç ãå¯è½é对象å æ¬ï¼ thisï¼ ä¸´çèµæºå¯¹è±¡ï¼Class 类对象
2ãåæ¥æ¹æ³
åæ¥æ¹æ³éå®çæ¯å½å对象ãå½å¤çº¿ç¨éè¿åä¸ä¸ªå¯¹è±¡å¼ç¨å¤æ¬¡è°ç¨å½ååæ¥æ¹æ³æ¶ï¼ éåæ¥æ§è¡ã
3ãåæ¥ä»£ç å
åæ¥ä»£ç åçåæ¥ç²åº¦æ´å ç»è´ï¼æ¯åä¸å¼åä¸æ¨èçç¼ç¨æ¹å¼ãå¯ä»¥å®ä½å°å ·ä½çåæ¥ä½ç½®ï¼èä¸æ¯ç®åçå°æ¹æ³æ´ä½å®ç°åæ¥é»è¾ãå¨æçä¸ï¼ç¸å¯¹æ´é«ã
Aï¼éå®ä¸´ç对象
åæ¥ä»£ç åå¨æ§è¡æ¶ï¼æ¯éå® object 对象ãå½å¤ä¸ªçº¿ç¨è°ç¨åä¸ä¸ªæ¹æ³æ¶ï¼éå®å¯¹è±¡ä¸åçæ åµä¸ï¼éåæ¥æ§è¡ã
Bï¼éå®å½å对象
4ãéçåºå±å®ç°
Java èææºä¸çåæ¥(Synchronization)åºäºè¿å ¥åéåºç®¡ç¨(Monitor)对象å®ç°ãåæ¥æ¹æ³ 并ä¸æ¯ç± monitor enter å monitor exit æ令æ¥å®ç°åæ¥çï¼èæ¯ç±æ¹æ³è°ç¨æ令读åè¿è¡æ¶å¸¸éæ± ä¸æ¹æ³ç ACC_SYNCHRONIZED æ å¿æ¥éå¼å®ç°çã
5ãéçç§ç±»
Java ä¸éçç§ç±»å¤§è´å为ååéï¼èªæéï¼è½»é级éï¼éé级éã
éç使ç¨æ¹å¼ä¸ºï¼å æä¾ååéï¼å¦æä¸æ»¡è¶³çæ¶åï¼å级为轻é级éï¼åä¸æ»¡è¶³ï¼å级为éé级éãèªæéæ¯ä¸ä¸ªè¿æ¸¡çéç¶æï¼ä¸æ¯ä¸ç§å®é çéç±»åã
éåªè½å级ï¼ä¸è½é级ã
6ãvolatile å ³é®å
åéç线ç¨å¯è§æ§ãå¨ CPU 计ç®è¿ç¨ä¸ï¼ä¼å°è®¡ç®è¿ç¨éè¦çæ°æ®å è½½å° CPU 计ç®ç¼åä¸ï¼å½ CPU 计ç®ä¸ææ¶ï¼æå¯è½å·æ°ç¼åï¼éæ°è¯»åå åä¸çæ°æ®ãå¨çº¿ç¨è¿è¡çè¿ç¨ä¸ï¼å¦ææåéè¢«å ¶ä»çº¿ç¨ä¿®æ¹ï¼å¯è½é ææ°æ®ä¸ä¸è´çæ åµï¼ä»è导è´ç»æé误ãè volatile 修饰çåéæ¯çº¿ç¨å¯è§çï¼å½ JVM 解é volatile 修饰çåéæ¶ï¼ä¼éç¥ CPUï¼å¨è®¡ç®è¿ç¨ä¸ï¼ æ¯æ¬¡ä½¿ç¨åéåä¸è®¡ç®æ¶ï¼é½ä¼æ£æ¥å åä¸çæ°æ®æ¯å¦åçååï¼èä¸æ¯ä¸ç´ä½¿ç¨ CPU ç¼åä¸çæ°æ®ï¼å¯ä»¥ä¿è¯è®¡ç®ç»æçæ£ç¡®ã
æ´å¤ãæ¤å¤è¿æå¾å¤ç»èéè¦éè¿å¦ä¹ å»äºè§£åå®åï¼æ¤å¤å°±ä¸ä¸ä¸å举äºã
äºã并åæ¡æ¶
并åæ¡æ¶å¾å¤ï¼å¦ExecutorServiceãRxJavaãDisruptorãAkkaçï¼å ·ä½éæ©åªä¸ªï¼æè é½ä¸éæ©ï¼æ¯æ ¹æ®é¡¹ç®éæ±éæ©çï¼æ¡æ¶æ¬èº«çå·®å¼å¹¶ä¸å¤§ï¼åºæ¬é½æ¯å¦ä¸æ¨¡å¼
Java是开源的,框架很多,这些框架都能解决特定的问题,提高开发效率、简化我们的代码复杂度,现在除了很多大家通用的一些主流框架外,很多公司针对自己的业务会自定义一些公司内部的框架,当然作为学习者我们首先要清楚Javaweb都有哪些框架需要学习。
回答这个问题首先要看我们的项目规模,对于”体量”较小的单应用项目,和需要处理海量数据、高并发的分布式项目所学习使用的框架还是不同的。
对于“体量”较小的单应用项目:
ORM型框架,很多Javaweb程序都需要使用关系数据库来进行数据的持久化,所以对于这种需要进行数据库操作的框架,也就是对JDBC进行封装的ORM框架是需要学习的,目前比较流行的是基于SQL的mybatis框架,这是一个轻量级的ORM框架,学习使用起来比较容易上手,同类型的还有Hibernate框架。
MVC型框架,MVC把程序从逻辑上分为视图层、控制层、模型层,各层各司其职,之间是相互调用的关系而不是相互依赖的关系,这种模式能很好的适应需求的变化及软件的升级变更。目前应用较多的MVC框架是spring MVC框架,这个框架有清晰的角色划分,有强大而直接的配置方式,高效的绑定和验证等很多优势。较早的Struts2框架也是MVC框架。
Spring框架,其实Java的从业者很多都绕不开Spring ,Spring家族有很多“工具”,编程思想从面相过程到面相对象是一个巨大的进步,然而随着程序越来越复杂,对象越来越多,高效的“管理”及应用这些对象变得越来越重要,Spring的IoC就是把对象的创建、“管理”交由Spring容器来进行,来实现控制反转,同时提供了各种注入值(DI)的方式,大大提高和简化了我们的工作,这就是javaweb需要学习的spring的IoC/DI;我们程序的业务比较复杂时,除了要完成核心功能外,还需要完成注入异常处理、日志记录、事务处理等常规功能,这些常规的操作比较耗费精力,springAOP(面向切面编程)就是解决这个问题的。
Javaweb需要学习一些前端框架,尤其是问题中提到的已经写好了数据接口,或者是已经有了简单的后台,前端框架jQuery是一定要学习的,如果项目基于效率考虑,需要前后端分离,可以学习vue等框架。
对于海量数据、高并发类型的分布式项目,这种类型项目的特点就是前面提到的需要处理的数据量大,例如双十一阿里需要处理的订单数据,比如12306的抢票等。
提升查询效率的缓存数据库框架Redis,这个框架在单应用程序中为了提升数据的读取效率也可以使用,先把数据从关系数据库通过Redis存放到缓存中,从缓存中读取数据的速度比直接从硬盘上读取就要高多了,另外Redis还能进行集群配置主从服务器等,使用非常方便,同类型的还有memcached框架;
在分布式中,服务集群中的负载均衡特别重要,Nginx是一个高性能的HTTP和反向代理服务框架,支持多种负载均衡算法;
消息队列框架:RabbitMQ、ActiveMQ、RocketMQ等,在电商系统中,当结算订单后,需要进行积分的变化等操作,这些操作的量很大,如果等积分变化结束后在通知用户结算成功,显然不可行,那么此时积分的变更操作交由消息队列来完成。
搜索框架,为了提升搜索的效率,创建搜索索引库及中文搜索分词等,可以使用solr框架,同类型的还有ElasticSearch
用于文件使用的分布式文件系统框架Fastdfs
Spring boot框架,简化了spring 的复杂配置,提供了Thymeleaf模板,很多微服务都是基于Springboot的;
微服务框架,把应用拆分成若干个为服务后,很好的适用了高并发及海量数据的处理,但是微服务的管理也很重要,目前基于服务注册、服务监控的框架有Dubbo+zookeeper,还有SpringCloud,里面包括SpringCloud Eureka,SpringCloud Ribbon,SpringCloud Feign,SpringCloudHystrix,SpringCloudZuul,SpringCloud Config,SpringCloud ZipKin,SpringCloud Sleuth等;
其它框架,还有很多根据项目特定要求的一些框架,例如进行日志记录的log4j框架,进行认证和授权的shiro框架,工作流处理的Activite框架等。
总结一下:学习框架最好的方式就是在实际项目中去应用,这对框架的原理、应用流程都能有很好的学习效果,如果单纯的做一些简单的Demo,框架的很多应用场景、优化、注意事项等是学习不全面的。