作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?
前言
对一个 Java 程序员而言,并发编程能否熟练掌握是判断他是不是优秀的重要标准之一。因为并发编程在 Java 语言中最为晦涩的知识点,它涉及内存、CPU、操作系统、编程语言等多方面的基础能力,更加考验一个程序员的内功深厚程度。
特别是当大数据时代的来临,高并发更加成为了家常便饭,在工作中,我们总是绕不开并发编程的任务。比如说,你想写个程序,一边从文件中读取数据,一边还要做实时计算…所以,想成为一名资深的 Java 后端工程师,并发编程是必须要牢牢把握的。那我们到底应该如何深入学习Java并发编程呢?
一、理论知识的掌握
- 并发理论基础
- 可见性、原子性和有序性问题:并发编程Bug的源头
- 互斥锁
- 管程:并发编程的万能钥匙
- Java线程
对于这上面的理论知识都要有去了解、掌握,以便以后能够熟练的运用到实践中去。
- 并发工具类
- Lock&Condition
- Semaphore
- ReadWriteLock
- StampedLock
关于这几个并发工具类,都要熟练掌握、熟练运用,还有很多并发工具类我没有全部列举出来,大家也需要多去学习与关注。多去了解与思考并发工具下,如何快速实现一个限流器?如何快速实现一个完备的缓存?该怎么利用这些工具类达到我们的目的。
- 并发设计模式
- Immutability模式
- Copy-on-Write模式
- 线程本地存储模式
- Balking模式
- Thread-Per-Message模式
这些模式也需要去了解,自己要去逐步研究这些模式下的运用规律,应该如何利用这些不变性解决并发问题,以及模式规范实现等。
- 案例分析
- 高性能限流器Guava RateLiniter
- 高性能网络应用框架Netty
- 高性能队列Disruptor
- 高性能数据库连接池HiKariCP
多去做一些案例分析,研究各个案例间的异同点,多看一些案例分析对以后上手做任务有好处,能在从中吸取经验。
- 其他并发模型
- Actor模型:面向对象原生的并发模型
- 软件实务内存:借鉴数据库的并发经验
- 协程:更轻量级的线程
- CSP模型:Golang的主力队员
为了让大家更加系统的掌握理论知识,在这里给大家分享一篇有阿里p8大神耗时187天整理的《Java并发编程》。上述很多知识点都会在中涉及到,从基础、高级、实践的角度讲解Java并发,让你融汇贯通,形成全面系统的并发编程知识体系。最终可以得心应手地解决各种并发难题,同时将这些知识用于其他编程语言。一分辛劳,三分收获。有需要完整版的朋友可以点击这里进群领取
二、勤练代码
编程语言的学习是一个漫长的过程,欲速则不达,不可能一步登天,并且是没有捷径走的,所以我们唯一能做的就是坚持练习,在这个过程中慢慢积累经验,把基础打扎实。
学习Java理论知识是一项必不可少的内容,但是在理论学习时也要同时开始动手敲代码,别等到完全理解才动手,因为在程序运行中的各种情况都能帮助你快速理解,让你更快更牢固地掌握知识点。只有保证每天都有一定的代码练习量,在遇到问题时才会有解决问题的思路。
然后不要认为写出了一个简单的小程序,就觉得自己已经学得非常好了,这只是编程学习过程中的一个小小实践,要达到独立做项目的程度还差一大截。
三、多做项目
对于学习不能只停留在理论以及基础代码,这样只会是纸上谈兵,起不到任何的实际作用,想要真正能够运用到实际生活、工作当中去,你就得开始去做项目了。
真正做项目时候会遇到的难题会更多,需要在看去不断摸索与研究,可以多调试,多尝试用不用的方法实现,通过这样的练习方式,对于Java的理论与实践更加的融会贯通、运用自如,会非常熟练的掌握与运用Java,得到非常大的提升。
特别是自己认真的用代码做完一个项目之后,你会非常的有成就感,心里说不出的喜悦,这个时候就要恭喜你,差不多已经掌握了Java这项语言。
四、经验总结
自己要在学习与实践中去总结经验,无论是成功的或是失败的,自己的或是他人的,都要照收不误,从失败的经验中吸取教训,在成功的经验中做更多的尝试,获得更多的成功。
我也给大家分享几点我的经验:
- 在代码的练习和做项目的时候,一定要注意代码保持规范性,细致了解代码机制,否则可能会导致整个项目发生错误。
- 不断建立自己的人脉圈,不断去结识新朋友,构建属于自己的Java学习圈,
- 最后也是非常重要的一点,确保基础知识的扎实性,提升自己分析问题、解决问题的能力,学无止境,强大到自己也能帮助别人解决问题,成为大佬级人物。
五、学习是最美好的字眼!
如今的互联网大环境遍地裁员,焦虑人人都有。你要做的,只是在一家公司深耕一段时间,等能力、时机皆成熟,再抬头看看外面的世界,你会发现自己的眼界和实力已经不可同日而语。
这里是一篇大神耗时187天整理的《 Java 并发编程》,对并发编程的学习路径做一个梳理,方便大家查漏补缺。需要的朋友可以通过评论区连接获取
第一部分 Java 并发编程基础篇
本篇主要介绍并发编程基础知识,包含两章内容,分别为并发编程线程基础以及并发编程的其他概念与原理解析。
第一章 并发编程线程基础
1.1 什么是线程
1.2 线程创建与运行
1.3 线程通知与等待
1.4 等待线程执行终止的 join 方法
1.5 让线程睡眠的 sleep 方法
1.6 让出 CPU 执行权的 yield 方法
1.7 线程中断
1.8 理解线程上下文切换
1.9线程死锁
——1.9.1 什么是线程死锁
——1.9.2 何避免线程死锁
1.10 守护线程与用户线程
1.11 ThreadLocal
——1.11.1 ThreadLoca 使用示例
——1.11 2 ThreadLocal 的实现原理
——1.11.3 ThreadLocal 不支持继承性
——1.11.4 InheritableThreadLocal
第二章 并发编程的其他基础知识
2.1 什么是多线程并发编程
2.2 为什么要进行多线程并发编程
2.3 Java 中的线程安全问题
2.4 Java 中共享变 的内存可见性问题
2.5 Java 中的 synchronized 关键字
——2.5.1 synchronized 关键字介绍
——2.5.2 synchronized 的内存语义
2.6 Java 中的 volatile 关键字
2.7 Java 中的原子性操作
2.8 Java 中的 CAS 操作
2.9 Unsafe类
——2.9.1 Unsafe 类中的重要方法
——2.9.2 如何千史用 Unsafe 类
2.10 Java 指令重排序
2.11 伪共享
——2.11.1 什么是伪共享
——2.11.2 为何会出现伪共享
——2.11.3 如何避免伪共享
——2.11.4 小结
2.12 锁的概述
——2.12 1 乐观锁与悲观锁.
——2.12.2 公平锁与非公平锁
——2.12 3 独占锁与共享锁
——2.12.4 什么是可重入锁
2.13 总结
因为篇幅有限,这里没有办法全部展示出来,只能列出目录表格供大家参考,有需要完整版的朋友可以点击这里领取
第二部分 Java 并发编程高级篇
在第一部分中我们介绍了并发编程的基础知识,而本部分则主要讲解并发包中一些主要组件的实现原理。
第三章 Java 并发包中 Thread Local Random 原理剖析
3 1 Random 类及其局限性
3 2 ThreadLocalRandom
3 3 源码分析
3.4 总结
第四章 Java 并发包中原子操作类原理剖析
4.1 原子变量操作类
4.2 JDK8 新增的原子操作类 LongAdder
——4.2.1 LongAdder 简单介绍
——4.2.2 LongAdder 代码分析
——4.2.3 小结
4.3 LongAccumulator 类原理探究
4.4 总结
第五章 Java 并发包中并发 List 源码剖析
5.1 介绍
5.2 主要方法源码解析
——5.2.1 初始化
——5 2.2 添加元素
——5.2.3 获取指定位置元素
——5.2.4 修改指定
——5.2.5 删除元素
——5.2.6 弱一致性的迭代器
5.3 总结
第六章 Java 并发包中锁原理剖析
6.1 LockSuppo 工具类
6.2 抽象同步队列 AQS 概述
——6.2.1 AQS——锁的底层支持
——6.2.2 AQS——条件变量的支持
——6.2.3 基于AQS 实现自定义同步器
6.3 独占锁 ReentrantLock 的原理
——6.3.1 类图结构
——6.3.2 获取锁
——6.3.3 释放锁
——6.3.4 案例介绍
——6 3.5 小结
6.4 读写锁 ReentrantReadWriteLock 的原理
——6 4.1 类图结构
——6.4.2 写锁的获取与释放
——6.4.3 读锁的获取与释放
——6 4.4 案例介绍
——6 4.5 小结
6.5 JDK 8 中新增的 Sta mpedLock 锁探究
——6.5.1 概述
——6.5.2 案例介绍
——6.5.3 小结
第七章 Java 并发包中并发队列原理
7.1 ConcurrentLinkedQueue 原理探究
——7.1.1 类图结构
——7.1.2 ConcurrentLinkedQueue 原理介绍
——7.1.3 小结
7.2 LinkedBlockingQueue 原理探究
——7.2.1 类图结构
——7.2.2 LinkedBlockingQueue 原理介绍
——7.2.3 小结
7.3 ArrayB lockingQueue 原理探究
——7.3.1 类图结构
——7.3.2 ArrayBlockingQueue原理介绍
——7.3.3 小结
7.4 PriorityBlockingQueue 原理探究
——7.4.1 介绍
——7.4.2 PriorityBlockingQueue 类图 结构
——7.4.3 原理介绍
——7 4.4 案例介绍
——7.4.5 小结
7.5 DelayQueue 原理探究
——7.5.1 DelayQueue 类图结构
——7.5.2 主要函数原理讲解
——7 5.3 案例介绍
——7 5.4 小结
第八章 Java 并发包中线程池 ThreadPoolExecutor 原理探究
8.1 介绍
8.2 类图介绍
8.3 源码分析
——8.3.1 public void execute(Runnable command)
——8.3.2 工作线程 Worker 的执行
——8 3.3 shutdown 操作
——8 3.4 shutdownNow 操作
——8.3.5 awaitTermination 操作
8.4 总结
第九章 Java 并发包中 ScheduledThreadPoolExecutor 原理探究
9.1 介绍
9.2 类图介绍
9.3 原理剖析
——9.3.1 schedule(Runnable command, long delay,TimeUnit unit)方法
——9.3.2 scheduleWithFixedDelay(Runnable command,long initia!Del long delay, TimeUmt umt)方法
——9.3.3 scheduleAtFixedRate(Runnable command,long initia!Del long period,Time Unit unit)方法
9.4 总结
第十章 Java 并发包中线程同步器原理剖析
10.1 CountDownLatch 原理剖析
——10.1.1 案例介绍
——10 1.2 实现原理探究
——10.1.3 小结
10.2 回环屏障 CyclicBarrier 原理探究
——10.2 1 案例介绍
——10.2.2 实现原理探究
——10.2.3 小结
10.3 信号量 Semaphore 原理探究
——10 3.1 案例介绍
——10.3.2 实现原理探究
——10.3 3 小结
10.4 总结
第三部分 Java 并发编程实践篇
在高级篇我们讲解了 Java 中并发组件的原理实现,在这一篇我们则要进行实践,只知道原理是不行的,还应该知道怎么在业务中使用。下面我们就来看看如何使用这些井发组件,以及进行并发编程时常会遇到哪些问题。
·第十一章 并发编程实践
11.1 ArrayBlockingQueue 的使用
——11.1.1 异步日志打印模型概述
——11.1 2 异步日志与具体实现
——11.1.3 小结
11.2 Tomcat 的 NioEndPoint 中 ConcurrentLinkedQueue 的使用
——11.2.1 生产者——Acceptor 线程
——11.2.2 消费者——Poller 线程
——11 2.3 小结
11.3 并发组件 ConcurrentHashMap 使用注意事项
11.4 SimpleDateFormat 是线程不安全的
——11 4.1 问题复现s
——11.4.2 问题分析
——11.4.3 小结
11.5 使用 Ti mer 需要注意的事情
——11.5.1 问题的产生
——11.5.2 Timer 实现原理分析
——11.5.3 小结
11.6 对需要复用但是会被下游修改的参数要进行深复制
——11.6.1 问题的产生
——11.6.2 问题分析
——11.6.3 小结
11.7 创建线程和线程池时要指定与业务相关的名称
——11.7.1 创建线程需要有线程名
——11.7.2 创建线程池时也需要指定线程池的名称
——11.7 3 小结
11.8 使用线程池的情况下当程序结束时记得调用 shutdown 关闭线程池
——11.8.1 问题复现
——11.8.2 问题分析
——11.8.3 小结
11.9 线程池使用 FutureTask 需要注意的事情
——11 9.1 问题复现
——11.9.2 问题分析
——11 9.3 小结
11.10 使用 ThreadLocal 不当可能会导致内存泄漏
——11.10.1 为何会出现内存泄漏
——11.10.2 在线程池中使用 ThreadLocal 导致的内存泄漏
——11.10.3 Tomcat 的 servlet 使用 ThreadLoca 导致内存泄漏
——11.10.4 小结
11.11 总结
正文在这里结束。因为文章内容实在是太多了,不能够给大家一 一体现出来,每个章节都有更加细化的内容。
有需要完整版的朋友可以点击这里进群找管理员领取
作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?的更多相关文章
- 一名3年工作经验的java程序员应该具备的职业技能
一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容.我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价.拿到的薪水势必也越高 ...
- 一名3年工作经验的java程序员应该具备的技能
一名3年工作经验的Java程序员应该具备的技能,这可能是Java程序员们比较关心的内容.我这里要说明一下,以下列举的内容不是都要会的东西—-但是如果你掌握得越多,最终能得到的评价.拿到的薪水势必也越高 ...
- 非名校毕业年薪20W程序员 心得分享
大家好,我是落落http://blog.csdn.net/robinson1988/ QQ692162374,其实我选择Oracle是一件很神奇的事情,但是现在回想起来又觉得是命中注定.我2006年就 ...
- 谁说双非本科就一定无缘阿里?H哥粉丝6面通过,喜提Offer!
本文来自作者投稿(原作者:小胖儿),原作者是一位2021届本科毕业生,就读于一所双非(非985.非211)院校,在今年2月份的时候,我曾经帮他指导过简历,并且根据他的简历内容帮他提了一些可能会问到的问 ...
- 双非本科Android开发,如何逆袭拿到大厂 Offer?
从2020年3月18日投出第一份暑期实习简历至今,已经过去400多天.我也尘埃落定,即将去CVTE做Android开发. 休息了很长时间,如今已经能够很平静地回首这段历程,写下这篇文,致敬曾经走过的漫 ...
- 非科班双非本科投的337家Java后台(励志)
考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 文章出自h ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- 一名十年Java程序员回忆阿里面试经历——揭开阿里面试的“遮羞布”
阿里面试经历 去阿里面试可以说非常非常的偶然和戏剧性,因为本人根本没投简历,以至于阿里hr给我电话的时候我一度认为是诈骗电话.因为深圳这家公司不错我还想在这里干个两年左右再考虑考虑. 这个时候的本人已 ...
- 非Java程序员转行Java-day01-入门基础
1.学习大纲介绍 课件中的代码及资料:提取码:yexw 学习中的依赖包及安装文件:提取码 :8par 2.数据流向分析 2.1.应用型软件开发本质 增删改查(非常重要,5星) 2.2.大型网站演变历史 ...
随机推荐
- mongoDB常用
登陆{ 本地的话直接mongo,如果是docker直接就这样docker exec -it 2d71a13e3128 mongo 或者直接这样 mongo 127.0.0.1:27017 } 退出是 ...
- linux集群压测部署方案
我们今天主要分享的内容从三方面讲解. 集群压力机部署 shell脚本简介 shell脚本搞定压力机部署 集群压力机部署 linux.png 分布式压测背景介绍 在企业项目实战时,如果被压的服务器处 ...
- IT培训软件测试怎么样,问问“过来人”!
经常看到有人在网上发帖子问:"XX培训(IT培训机构)怎么样,学过的老哥可以出来讲讲真话吗?"问这种问题的同学,来,站起来!我不得不在这儿说你两句:你要想知道一家IT培训机构到底怎 ...
- Redis6.x学习笔记(二)持久化之RDB
前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...
- QFNU 10-30 training
7-9 特立独行的幸福 题意:见PTA 思路:其实就是遍历进行查找,利用递归函数,为了解决是特立独行,还要用一个全局数组进行存储所有满足条件的数进行去重标记,最后在输出的时候进行判断是否是只读取过一次 ...
- Scrum Meeting 0
Basic Info where:五号教学楼 when:2020/4/21 target: 明确每次会议基本流程 简要汇报一下已完成任务,下一步计划与遇到的问题 Progress Team Membe ...
- Zoho创始人斯瑞达.温布获评“年度最佳CEO”
近日,权威研究和咨询机构Constellation Research公布了一系列奖项,Zoho创始人斯瑞达.温布获评"年度最佳CEO"(The Best Enterprise CE ...
- Linux进阶之find命令、xshell速度慢的解决和Linux警告音的关闭
一.Linux警告音关闭方法 1. 修改/etc/inputrc配置文件 set bell-style none #取消该行注释 2. 修改~/.bashrc配置文件 在后面增加: setter ...
- 设置添加SSH-(转自破男孩)
很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地.然而,为什么绝大多数人会使用https url克隆呢? 这是因为,使用 ...
- 2.1 CPU 上下文切换(上)
cpu上下文与切换 进程在竞争 CPU 的时候并没有真正运行,为什么还会导致系统的负载升高呢?CPU 上下文切换就是罪魁祸首. 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量 ...