当前位置: 首页 > news >正文

【进阶之路】如何提升 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 是多少?

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

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

相关文章:

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

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

Git一台电脑 配置多个账号

Git一台电脑 配置多个账号 Git一台电脑 配置多个账号 常用的Git版本管理有 gitee github gitlab codeup ,每个都有独立账号,经常需要在一个电脑上向多个代码仓提交后者更新代码,本文以ssh 方式为例配置 1 对应账号 公私钥生成 建议&#…...

2024年华为OD机试真题-素数之积-Java-OD统一考试(C卷)

题目描述: RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积。 输入描述: 一个正整数num 0 < num <= 2147483647 输出描述: 如果成功找到,以单个空…...

汤姆·齐格弗里德《纳什均衡与博弈论》笔记(2)

第三章 纳什均衡——博弈论的基础 冯诺伊曼没有解决的问题 博弈论在其建立初始也显现出了严重的局限性。冯诺伊曼解决了二人零和博弈&#xff0c;但对多人博弈问题仍无法解决。如果只是鲁宾逊克鲁索和星期五玩游戏&#xff0c;博弈论可以很好地被应用&#xff0c;但它无法精确…...

QT上位机开发(动态数据采集与监控)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上位机开发中,有一种类型的应用软件很特殊,它几乎没有什么交互操作,主要的工作就是检测和显示。如果说在此基础上有什么扩展的话,可能就是安全监控和报警。所以,这个上位机软件…...

vue2 -- 截图工具html2canvas

文章目录 🍉需求描述🍉基础功能实现🍉下载另存为本地图片功能🍉需求描述 可以将网页中的指定元素或整个页面截取为图片,以便保存或分享。 🍉基础功能实现 在 Vue 中使用 html2canvas 实现 1:安装 html2canvas 库。你可以使用 npm 安装,命令如下: npm install …...

笔记-孙子兵法-第三篇-谋攻(1)-不战而屈人之兵,上兵伐谋,韩信之死

笔记-From 《华杉讲透孙子兵法》和《兵以诈立&#xff0c;我读孙子》 第三篇-谋攻&#xff08;1&#xff09;不战而屈人之兵 《孙子兵法》第一篇讲计&#xff0c;第二篇讲野战&#xff0c;第三篇就讲攻城。 《孙子》尚谋&#xff0c;认为最好是“不战而屈人之兵”&#xff0…...

kafka参数配置参考和优化建议 —— 筑梦之路

对于Kafka的优化&#xff0c;可以从以下几个方面进行思考和优化&#xff1a; 硬件优化&#xff1a;使用高性能的硬件设备&#xff0c;包括高速磁盘、大内存和高性能网络设备&#xff0c;以提高Kafka集群的整体性能。 配置优化&#xff1a;调整Kafka的配置参数&#xff0c;包括…...

如何本地搭建Splunk Enterprise数据平台并实现任意浏览器公网访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步&#xff0c;结合cpolar内网穿透工具实现随时随地在任意浏览器&#xff0c;远程访问在本地…...

FlinkAPI开发之状态管理

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 Flink中的状态 概述 有状态的算子 状态的分类 托管状态&#xff08;Managed State&#xff09;和原始状态&…...

initdb: command not found【PostgreSQL】

如果您遇到 “initdb: command not found” 错误&#xff0c;说明 initdb 命令未找到&#xff0c;该命令用于初始化新的 PostgreSQL 数据库群集。这通常是因为 PostgreSQL 相关的工具未正确安装或者安装路径不在系统的 PATH 变量中。 以下是解决这个问题的一些建议&#xff1a…...

QT第六天

要求&#xff1a;使用QT绘图&#xff0c;完成仪表盘绘制&#xff0c;如下图。 素材 运行效果&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPen>QT_BEGIN_NAMESPACE name…...

linux 安装 grafana

Ubuntu 和 Debian(64 位)SHA256&#xff1a; e551434e9e3e585633f7b56a33d8f49cda138d92ad69c2c29dcec2c3ede84607 sudo apt-get install -y adduser libfontconfig1 muslwget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.2.3_amd64.debsudo dpkg -i gra…...

“GPC爬虫池有用吗?

作为光算科技的独有技术&#xff0c;在深入研究谷歌爬虫推出的一种吸引谷歌爬虫的手段 要知道GPC爬虫池是否有用&#xff0c;就要知道谷歌爬虫这一概念&#xff0c;谷歌作为一个搜索引擎&#xff0c;里面有成百上千亿个网站&#xff0c;对于里面的网站内容&#xff0c;自然不可…...

Kotlin协程的JVM实现源码分析(下)

协程 根据 是否保存切换 调用栈 &#xff0c;分为&#xff1a; 有栈协程&#xff08;stackful coroutine&#xff09;无栈协程&#xff08;stackless coroutine&#xff09; 在代码上的区别是&#xff1a;是否可在普通函数里调用&#xff0c;并暂停其执行。 Kotlin协程&…...

js实现九九乘法表

效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">// 输出乘法口诀表// document.write () 空格 " " 换行…...

HarmonyOS鸿蒙应用开发(三、轻量级配置存储dataPreferences)

在应用开发中存储一些配置是很常见的需求。在android中有SharedPreferences&#xff0c;一个轻量级的存储类&#xff0c;用来保存应用的一些常用配置。在HarmonyOS鸿蒙应用开发中&#xff0c;实现类似功能的也叫首选项&#xff0c;dataPreferences。 相关概念 ohos.data.prefe…...

基于 IDEA 进行 Maven 工程构建

1. 构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程&#xff0c;在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分&#xff0c;它能够大大提高软件开发效率&am…...

牛客周赛 Round 17 解题报告 | 珂学家 | 枚举贪心 + 二分最短路

前言 整体评价 其实T3最有意思&#xff0c; T4很典&#xff0c;是一道二分最短路径经典套路。 T3 如果尝试 增量差值最小 的最大梯度去贪心的话&#xff0c;会失败&#xff0c;需要切换思路。 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的正方形披萨 如果横竖差…...

喝口水都长胖?原来是“胖菌”惹的祸?!

减肥是一个永恒的话题&#xff0c;而关于长胖的原因&#xff0c;已有研究很多都聚焦在肥胖人群中肠道菌群的种类和丰度&#xff0c;很少有研究关注肠道微生物的基因与宿主肥胖的关系。近期发表在《Nature Medicine》的这项研究&#xff0c;使用来GWAS研究人类肠道微生物组与宿主…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...