凉衫薄

人生哪能多如意,万事只求半称心。
未分类
一、引言 如果说盗梦空间的剧情是递归,那么恐怖游轮绝对是不同代码分支中的循环以及多进程的同步过程。 二、工程结构及代码逻辑 1、该剧情有master和dev两个代码分支 2、dev分支的代码逻辑只包含邮轮上剧情,非死循环(包括邮轮上的三个‘小循环’,其实是顺序结构,分别表示dev分支中女主的三个时期D1、D2、D3),这是一个多进程的程序,假设当前进程为dev分支的进程1,我们从当前进程的角度来描述这三个时期: D1时期:女主从帆船上刚踏进邮轮 D2时期:女主看见master分支进程1的女主踏进邮轮(此时相对于master分支进程1中的女主是M1时期) D3时期:女主看见dev分支进程2的女主踏进邮轮(此时相对于dev分支进程2中的女主是D1时期),并最终被dev分支进程2的女主杀死 伪代码先这样表示着: //轮船剧情 public void liner(){ D1(); D2(); D3(); } 3、master分支的逻辑包括岸上剧情和邮轮剧情,且总体是死循环(包括岸上剧情的顺序结构和邮轮上有三个‘小循环’,其实也是顺序结构,分别表示master分支中女主在船上的三个时期M1,M2,M3,岸上剧情表示为M0),master分支同样是多进程,假设当前进程为master分支的进程1,我们从当前进程的角度来描述这四个时期: M0时期:女主的岸上剧情 M1时期:女主从帆船上刚踏进邮轮 M2时期:女主看见dev分支进程1的女主踏进邮轮(此时相对于dev分支进程1中的女主是D1时期) M3时期:女主看见master分支进程2的女主踏进邮轮(此时相对于master分支进程2中的女主是M1时期),并最终被master分支进程2中的女主推下海,死循环进入岸上剧情的M0时期 用伪代码先这样表示着: //岸上剧情 void shore(){ } //邮轮剧情 void liner(){ M1(); M2(); M3(); } //总剧情 while(true){ shore(); liner(); } 三、如何运行 4、这是一个多进程的程序,难点就在进程的同步过程 5、首先master分支代码起多个进程(最少两个,因为邮轮的剧情进行M1时期的女主可以遇到M3时期的女主,她们同属于master分支的不同进程,master分支的进程可以理解为守护进程,是死循环会一直留在系统当中,参与与dev分支进程的同步) 6、其次dev分支代码起多个进程(dev分支的代码是非死循环的,在dev分支的邮轮剧情中,D3时期的女主会被另一个进程中正在经历D1时期的女主杀死从而结束进程,所以dev分支是需要不断的有新进程启动加入才能维持这个同步过程的) 四、进程的同步过程 7、需要同步的代码块只发生在邮轮上,且同一时刻同步过程中多个进程之间的状态只能有以下两种情况 情况一:M1 D2 M3 情况二:D1 M2 D3 引用B站某up主的视频截图就是如下所示(斜对角就是一个进程在邮轮剧情上的生命周期): 8、M3结束后,master分支中的女主又开始岸上剧情,以此循环下去。D3结束,意味着dev分支中的女主被杀死了,该进程的生命周期就结束了,为了维持这个同步过程,需要不断地再启动一个dev分支的进程,并加入到同步当中,换句话也就是说,master分支中正处于M2时期的女主又看到dev分支中的女主踏上邮轮了。啊啊啊!!!烧脑啊!!! 五、以Java多线程同步方式继续完善伪代码 dev分支: //D1时期 void D1(){ //获取时期1的锁,只允许一个进程进入时期1 synchonized(period1){ //判断是否可以进入D1时期,否则等待 while(!condition){ period1.wait(); } //TODO 开始D1时期剧情 //唤醒其他等待进入时期1的进程 period1.notifyAll(); } } //D2时期 void D2(){ //获取时期2的锁,只允许一个进程进入时期2 synchonized(period2){ //判断是否可以进入D2时期,否则等待 while(!condition){ period2.wait(); } //TODO 开始D2时期剧情 //唤醒其他等待进入时期2的进程 period2.notifyAll(); } } //D3时期 void D3(){ //获取时期3的锁,只允许一个进程进入时期3 synchonized(period3){ //判断是否可以进入D3时期,否则等待 while(!condition){ period3.wait(); } //TODO 开始D3时期剧情 //唤醒其他等待进入时期3的进程 period3.notifyAll(); } } //轮船剧情 void liner(){ D1(); D2(); D3(); } master分支: //岸上剧情 void shore(){ } //M1时期 void M1(){ //获取时期1的锁,只允许一个进程进入时期1 synchonized(period1){ //判断是否可以进入M1时期,否则等待 while(!condition){ period1.wait(); } //TODO 开始M1时期剧情 //唤醒其他等待进入时期1的进程 period1.notifyAll(); } } //M2时期 void M2(){ //获取时期2的锁,只允许一个进程进入时期2 synchonized(period2){ //判断是否可以进入M2时期,否则等待 while(!condition){ period2.wait(); } //TODO 开始M2时期剧情 //唤醒其他等待进入时期2的进程 period2.notifyAll(); } } //M3时期 void M3(){ //获取时期3的锁,只允许一个进程进入时期3 synchonized(period3){ //判断是否可以进入M3时期,否则等待 while(!condition){ period3.wait(); } //TODO 开始D3时期剧情 //唤醒其他等待进入时期3的进程 period3.notifyAll(); } } //邮轮剧情 void liner(){ M1(); M2(); M3(); } //总剧情 while(true){ shore(); liner(); }
1. Java语法 很多人推荐《Java编程思想》,我是不推荐这本书入门,外国人写的东西就是啰啰嗦嗦,《从入门到精通》系列挺好的,习惯了中国式教育,高效快速。 2. Java Web 说实话,jsp这些东西已经很过时了,但是servlet-api里面的一些东西直接影响了你学后面的一些东西,比如:过滤器,监听器,会话之类的,多看看web.xml里的一些配置,知道这些东西该怎么配。 3. Maven 项目依赖,构建管理工具,学会如何配置仓库,镜像,特别重点:生命周期和插件。 4. SSM还是SSH SSH是指(spring+struts2+hibernate),SSM是指(spring+springMVC+mybatis),结合现在形式来看,除非你去维护一些老项目,不然SSH这一套绝对过时了,当然spring-data-jpa里面用到了hibernate,这个可以学学,不然你就去学SSM,下面分开来讲。 5. Spring Java的生态真的得感谢Spring,具体的自己去看书,下面划一下重点。 1、IoC控制反转 2、AOP面向切面编程 3、Bean生命周期 4、Spring数据库事务(敲黑板特别重点,期末要考:四种隔离级别和传播行为) 5、jdk代理和cglib代理的区别 实战:Maven创建web项目后,如何写配置文件整合Spring(一个程序员最起码离开各种平台要学会搭项目,配置项目)。 6. Spring MVC 作为Spring全家桶的一个成员完美的诠释了MVC架构,下面划一下重点。 1、Spring MVC处理请求流程(敲黑板特别重点,期末要考) 2、Spring MVC几种注解的应用 实战:在上一个实战的基础上,把Spring MVC给整合进去,怎么去写配置 7. Mybatis 比较流行的持久化框架,优点在于暴露sql,便于sql优化,适合互联网架构场景。下面划一下重点。 1、懒加载,别名,Typehandler等概念 2、mapper.xml文件的书写 3、一对多关系的查询 4、分页插件 实战:在上一个实战的基础上,把Mybatis给整合进去,怎么去写配置文件。能够做到SSM的整合算是互联网架构入门了,真是这样。 8. redis 当下最最流行的缓存中间件,不废话,直接划重点 1、redis的几种数据结构 2、redis命令行接口的使用 3、redis编程接口的使用 4、redis的主从结构 5、SSM项目如何整合Redis,RedisTemplate和CacheManager等一些常见API的使用 实战:在整合了SSM框架的基础上,通过Spring把Redis也给整合进去,如何去写配置 9. rabbitmq 消息队列,除此之外还有activemq,这里只介绍rabbitmq,划重点 1、熟悉amqp协议 2、rabbitmq中几种交换机的区别和使用场景 3、rabbitmq的几种使用场景(削峰,异步,解耦) 4、rabbitmq的命令行接口和编程接口 5、SSM项目整合rabbitmq,熟悉AmqpTemplate,RabbitTemplate,MessageListener等API 实战:在整合SSM框架的基础上,通过Spring把Rabbitmq给整合进去,如何去写配置 10. zookeeper,dubbo 这两个放一块讲,zookeeper作为分布式协同中间件,平时用的比较多的地方算是在dubbo里面了,dubbo是阿里推出的一个RPC框架,dubbox是当当网在dubbo的基础上支持了RESTFUl接口,划重点。 1、zookeeper的数据结构 2、zookeeper的选主算法 3、zookeeper的命令行接口和编程接口 4、dubbo的流程,原理和配置,如何向注册中心注册 实战:在整合SSM框架的基础上,通过Spring将zookeeper和dubbo给整合进项目里,如何去写配置。 11. shiro 这东西严格来说不是中间件,算一个授权认证框架,还有Spring-Security也是,不过Spring-security比较重量级,一般会选择使用shiro,下面划重点。 1、整个shiro处理授权认证流程的架构都很重要 2、如何通过shiro过滤器代理web请求 3、如何开发自定义Realm 4、凭证匹配器 5、三种过滤器(FormAuthenticationFilter,UserFilter,LogoutFilter) 6、如何自定义过滤器 7、会话管理器(会话持久化) 8、缓存管理器(怎么去整合redis缓存) 9、rememberMe管理器 10、安全管理器 11、如何定义URL过滤规则 实战:在整合SSM框架的基础上,通过Spring将shiro给整合进项目里,如何去写配置,如何实现授权认证流程,如何进行权限管理 12. Spring boot 上面在实战过程中,通过Spring去整合各种框架和中间件的xml配置是不是写得很头痛,现在有了一个更好得东西叫Spring boot,这个东西没别的,就是帮你解决以上配置繁琐的问题的。Spring boot是基于约定的配置和自动化配置。什么是约定的配置呢?比如,一般我们项目会设置端口为8080,所以他就帮你约定配置好了这个端口,你就不需要去配置端口了,当然你要想改为其他端口也还是可以改的。什么是自动化配置呢?比如Spring boot检测到你类路径下有Mybatis相关的类,那么他就会从你的properties中,去找数据库ip,用户,密码等,然后帮你把mybatis自动给配置好,有了这东西,你能从这些繁琐的配置中解放出来,而更关注于业务层面。 13. Spring Cloud 当下流行的一个微服务框架,以Spring boot项目为基础,划重点。 1、服务治理中心 2、微服务之间的互相调用(RestTemplate和Feign) 3、网关(zuul和gateway) 4、服务容错(降级和熔断的概念和实现) 5、服务追踪 6、消息总线 7、配置中心 8、Ribbon客户端负载均衡策略 9、分布式事务(敲黑板特别重点,期末要考) 14. Linux 1、目录文件的操作 2、软件的安装及配置 3、Linux系统的目录结构 4、Vi/Vim编辑器的使用 5、通过源码编译软件(有些软件根本就不提供二进制发行版,你不得不通过源码编译OpenCV、Redis) 6、进程的操作,网络的操作 7、《UNIX环境高级编程》选读,你能了解Linux C一些API,对Linux更了解 8、不同发行版的区别(主流的就三种系列Redhat,debian,arch) 15. docker 现在都是云原生应用,容器化部署,devops的热门,更是将docker推向高潮,最为一个开发人员,最基本的运维还是要懂的,其实你会Linux的话,docker简直如鱼得水,下面划重点。 1、docker基本的命令(拉取镜像,创建容器,commit镜像,push镜像) 2、dockerfile脚本的书写,如何去构建镜像 3、进入运行容器的几种方式(attach,exec,ssh等) 4、docker-compose编排docker服务,docker-compose.yml配置的书写 16. nginx 反向代理服务器,划重点。 1、反向代理和正向代理的区别和概念 2、nginx配置,如何转发请求 3、动静分离,负载均衡等概念 17. Java多线程 1、synchronized同步 2、lock同步 3、死锁问题 4、volatile关键字 5、线程状态的变化 6、线程组的概念 7、线程间的通信 18. JVM JVM虚拟机这东西全是重点,去看书死啃 19. 设计模式 1、单例模式 2、适配器模式 3、工厂模式 4、观察者模式 5、装饰器模式 6、代理模式 7、建造者模式 8、桥接模式 9、责任链模式 20. 数据结构与算法 1、线性表(链表,对列,栈) 2、树(二叉树,排序二叉树,红黑树,B树,B+树,平衡二叉树,赫夫曼树) 3、森林(树和森林的转换) 4、图论(如何找最短路径) 5、各种排序算法 结束 好好看看吧,会对你有帮助,欢迎补充。