【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力?

在这里插入图片描述

可能很多初学者在学完 SpringBoot 之后,做了 1-2 个项目之后,不知道该去学习什么了,其实这时候需要去学习的东西还有很多,接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习,提高自己的编程内力!

对于这些进阶方面的内容,我也整理了一份 PDF,点击查看

高并发进阶

在这里插入图片描述

我们自己在学习中做的项目一般不会放到真正环境去测试,而且测试的话,一般也是发送单个请求,看整个业务流程是否正确,并没有考虑到 并发安全 的问题,那么在数据量大的项目中,多线程、并发安全问题是很重要的,因此并发相关的内容是需要去进一步增强的

就比如高并发场景下,对于共享数据的操作,要加上锁,否则会出现线程安全的问题,这里举个最简单的例子,i ++ 操作是分为 3 个步骤执行的:

1.读取 i 的值
2.将 i 的值加一
3.写入 i 的值

那么可能线程 A 和线程 B 同时执行第 1 步,取到相同的 i 值,那么对同一个 i 值加一,两个线程执行两次 i++ 应该加 2,最后的结果确实加 1,造成了线程不安全

该如何进阶呢?

对于并发中的 synchronized、volatile 一定要了解,以及分布式锁要了解

分布式锁用在哪些场景呢?

用在多个接口同时操作一个数据的场景下,比如对缓存列表的构建,假设列表缓存的构建时机有两个:

  • 第一个是真正来查询该用户分享的内容列表时(延迟构建,在真正查询时再进行构建,避免占用 Redis 内存),此时先在数据库中查询分页数据,再去缓存中构建分页缓存
  • 第二个是用户修改或者新增分享的内容时,此时通过 RocketMQ 来异步通知,去对缓存中的分页列表进行重新的构建

那么可以来看一种并发下的极端情况会出现的问题:

当用户 A 新增分享的时候,另一个用户 B 此时正好来查询用户 A 的分享列表,用户 B 线程先去缓存中查询,发现没有,再去数据库中查询用户 A 的分享列表,此时 B 拿到了 A 新增分享之前的旧数据,此时如果用户 A 新增分享并落库,并且去缓存中对用户 A 的列表缓存进行重建,那么此时缓存列表中是用户 A 的最新数据,但是此时用户 B 的线程在数据库中已经查到了用户 A 的旧数据,用户 B 的线程继续执行,将用户 A 的旧数据给放入到列表缓存中,覆盖掉了用户 A 更新的缓存,那么此时就会导致缓存数据库不一致

这时候就需要去在这两个操作缓存列表的位置 添加分布式锁,保证顺序操作,而不会并发操作!

JVM 进阶

在这里插入图片描述

在 JVM 方面,也是要深入理解的,因为你在 Java 代码中写的一些变量、方法等等都是基于 JVM 来进行存储的,那么对于 JVM 的 内存模型 肯定要了解:堆、栈、方法区

JVM 中另一块重要的内容就是 垃圾收集,这里主要需要了解常见的一些垃圾收集算法的垃圾收集器,要了解 JVM 收集垃圾的流程

最后进阶方面就是 JVM 的调优,说是调优,其实就是处理一些线上环境的 JVM 问题,就比如你肯定要给 JVM 添加监控,那么如果监控到 JVM 的 GC 停顿时间很长怎么办呢?

可以看看一般就是 gc 次数过多,而 full gc 停顿时间比较长,一般就是频繁发生 full gc,那么为什么会频繁 full gc?

那么可能就是因为频繁去创建大对象,JVM 发现对象在新生代放不下,因此直接放到老年代,导致老年代很快空间不足,频繁发生 full gc

设计模式进阶

在这里插入图片描述

设计模式是想高级开发进阶的必经之路,因为设计模式中提供了很多经过长时间检验的特定问题解决方案,掌握了设计模式,写出的代码具有更好的健壮性、可维护性和可扩展性

并且利用好设计模式,可以使得代码具有更好的重用性,拒绝 code shit moutain!

如果你之后需要去设计一个系统架构,那么如果不了解设计模式,可能无法做出很好的设计

总结博客

在学习、工作之余,一定要善于总结,通过写文章来总结,可以将自己工作中碰到的一些亮点和困难点提炼出来,以及未来的一些改进之处,总结的多了之后,就可以对我们平时做的工作有很清晰的认知,避免出现,在面试的时候,面试官问:“你平时做的工作中遇到过什么困难吗?”,一时半会也想不起来,就算想起来,由于没有提前准备,说的也磕磕绊绊,所以一定要去总结博客!
你通过将自己学到的内容总结出来提供价值给其他人之后,你也可以从中获利,像比较厉害的一些大佬都有整理笔记的习惯:

  • 美团技术团队
  • 吕文翰
  • 柳伟卫
  • pdai

源码进阶

在这里插入图片描述

如果继续向高级工程师进阶,源码是必须要了解的,为什么非要去学习源码呢?

首先,对于常用的中间件,比如 RocketMQ,我们去学习它的源码,那么在生产环境中,如果 RocketMQ 出了一些问题,可以直接从源码级别定位问题,去解决问题,如果不了解源码的话,可能要折腾很长时间了

其次,目前广泛使用的中间件的架构设计的都是很好的,包括设计模式、线程池的使用非常标准,我们可以去学习源码中如何使用,进而引进到我们自己的项目中,提升系统架构设计的能力

生产经验进阶

在这里插入图片描述

最后就是生产经验的能力了,这考验我们接触项目的生产环境到底多不多,以及对于生产中的一些部署和问题的解决

比如说,现在基本上分布式系统中都会有网关系统,那么网关系统我们如何去部署了,部署几台,部署机器的配置是怎样的?

那么每天打到网关上的流量是多少,高峰期的 QPS 是多少?

如果访问量增长,怎么去抗下更高的请求数量呢?

上边这些就是考察生产环境方面的能力,因此在工作中,机器上线之后,一定要去给系统部署上监控,多去看看监控,了解系统最大承载并发请求的能力以及机器的配置,因为不同机器配置下,可以处理的请求量也是不同的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242828.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Ubuntu的gnome切换KDE Plasma

文章目录 安装KDE Plasma桌面环境添加软件源并更新apt安装kubuntu-desktop(作者没有成功)aptitude安装kubuntu-desktop多次aptitude install(特别重要特别重要)其他kde软件包 卸载gnome桌面 Ubuntu自带的桌面环境是gnome&#xff…

opencv009 滤波器01(卷积)

图像卷积操作(convolution),或称为核操作(kernel),是进行图像处理的一种常用手段, 图像卷积操作的目的是利用像素点和其邻域像素之前的空间关系,通过加权求和的操作,实现…

073:vue+mapbox 加载here地图(影像瓦片图 v3版)

第073个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载here地图的影像瓦片图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)相关API参考:专栏目标示例效果

vue项目执行依赖安装(npm i或npm install )报ls-remote -h -t异常

从git拉取的vue项目执行依赖安装时一直报错, 报错如下图:首先,查看了node版本、npm配置的镜像地址均没找到解决办法。 在命令行中直接输入git发现提示于是从网上搜到了一个博文https://blog.csdn.net/weixin_49159364/article/details/118198…

Golang leetcode28 找出字符串中第一个匹配项的下标 KMP算法详解

文章目录 找出字符串中第一个匹配项的下标 leetcode28 串的模式匹配问题暴力求解使用KMP模式匹配算法KMP算法简述 KMP算法的代码实现 找出字符串中第一个匹配项的下标 leetcode28 串的模式匹配问题 暴力求解 func strStr(haystack string, needle string) int { L : len(need…

文件操作和IO(1)

认识文件 先来认识狭义上的文件(存储在硬盘(磁盘)上).针对硬盘这种持久化的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般. 注意:硬盘 ! 磁盘 磁盘属于…

LV.19 D1 C++简介 学习笔记

一、C概述 1.1 C的前世今生 C是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程范式,例如过程化程序设计、面向对象程序设计、泛型程序设计和函数式程序设计等。 C的发展: 1.2 C的主要应用领域 C是一门运用很广…

OpenCV——双边滤波

目录 一、双边滤波二、C代码三、python代码四、结果展示 OpenCV——双边滤波由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、双边滤波 双边滤波是一种综合考虑滤波器内图像空域信息和滤波器内图像像素灰度值相似性的…

【代码实战】从0到1实现transformer

获取数据 import pathlibimport tensorflow as tf# download dataset provided by Anki: https://www.manythings.org/anki/ text_file tf.keras.utils.get_file(fname"fra-eng.zip",origin"http://storage.googleapis.com/download.tensorflow.org/data/fra-…

使用golang对接微软Azure AI翻译

文章目录 一、官方地址二、准备工作三、代码示例 一、官方地址 https://learn.microsoft.com/zh-CN/azure/ai-services/translator/translator-text-apis?tabsgo 二、准备工作 创建服务 创建服务连接地址:https://portal.azure.com/#create/Microsoft.CognitiveS…

回调地狱与解决方案

什么是回调地狱? 简单理解就是回调函数嵌套回调 示例: setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示,回调函数嵌套回调,就…

【golang】Context超时控制与原理

Context 在Go语言圈子中流行着一句话: Never start a goroutine without knowing how it will stop。 翻译:如果你不知道协程如何退出,就不要使用它。 在创建协程时,我们可能还会再创建一些别的子协程,那么这些协程的…

git使用的常用指令

git作为一个版本控制工具,和maven并合称为实习的两大杀手工具。今天我来给大家介绍一下git的常用指令,帮助大家在实习和多人协同开发的时候提供一些帮助。 找到git管理的文件夹 命令1 git init 这个命令是为了初始化本地库 命令2 查看当前的git状态…

Springboot 子工程构建完后无法找到springboot依赖

问题: 构建完子工程后无法找到SpringBootTest 解决方案: 最好用这个构建 https://www.cnblogs.com/he-wen/p/16735239.html 1.先观察项目目录 是否正确 2.观察子工程目录 3.看pom.xml中是否引用springboot依赖 4.检查代码 查看父项目是否包含子模块 查看子模块的父项目是否…

AI教我学编程之C#类的基本概念(1)

前言 在AI教我学编程之C#类型 中,我们学习了C#类型的的基础知识,而类正是类型的一种. 目录 区分类和类型 什么是类? 对话AI 追问 实操 追踪属性的使用 AI登场 逐步推进 提出疑问 药不能停 终于实现 探索事件的使用 异步/交互操作 耗时操…

选择排序(二)——堆排序(性能)与直接选择排序

目录 一.前言 二.选择排序 2.1 堆排序 2.2选择排序 2.2.1 基本思想 2.2.2直接选择排序 三.结语 一.前言 本文给大家带来的是选择排序,其中选择排序中的堆排序在之前我们已经有过详解所以本次主要是对比排序性能,感兴趣的友友可移步观看堆排&#…

Pyro —— Creating Explosions

目录 Sourcing Adding debris to an explosion Adding sparks to an explosion Trails Trail Path Shapes Trail Source Types Understanding trails Incorporating trails into your explosion Sourcing Pyro Burst Source节点创建爆炸核心源,且对外观塑形…

Linux 系统之部署 h5ai 目录列表程序

一、h5ai 介绍 1.1)h5ai 简介 h5ai 是用于 HTTP Web 服务器的现代文件索引器,专注于您的文件。目录以吸引人的方式显示,浏览它们通过不同的视图、面包屑和树概述得到增强。最初 h5ai 是 HTML5 Apache Index 的首字母缩写,但现在它…

midjourney充值订阅卡被拒绝了怎么办?

一、 AI绘图是什么? 就是AI绘画,顾名思义就是利用人工智能进行绘画,是人工智能生成内容(AIGC)的一个应用场景。其主要原理简单来说就是收集大量已有作品数据,通过算法对它们进行解析,最后再生成…

消息队列介绍

什么是 MQ MQ(message queue),本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常 见的上下游“逻辑解耦…