当前位置: 首页 > 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研究人类肠道微生物组与宿主…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...