程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?

发布于2021-06-14 09:41     阅读(353)     评论(0)     点赞(25)     收藏(4)


前言

对一个 Java 程序员而言,并发编程能否熟练掌握是判断他是不是优秀的重要标准之一。因为并发编程在 Java 语言中最为晦涩的知识点,它涉及内存、CPU、操作系统、编程语言等多方面的基础能力,更加考验一个程序员的内功深厚程度。

特别是当大数据时代的来临,高并发更加成为了家常便饭,在工作中,我们总是绕不开并发编程的任务。比如说,你想写个程序,一边从文件中读取数据,一边还要做实时计算…所以,想成为一名资深的 Java 后端工程师,并发编程是必须要牢牢把握的。那我们到底应该如何深入学习Java并发编程呢?

 

一、理论知识的掌握

  • 并发理论基础
  1. 可见性、原子性和有序性问题:并发编程Bug的源头
  2. 互斥锁
  3. 管程:并发编程的万能钥匙
  4. Java线程

对于这上面的理论知识都要有去了解、掌握,以便以后能够熟练的运用到实践中去。

  • 并发工具类
  1. Lock&Condition
  2. Semaphore
  3. ReadWriteLock
  4. StampedLock

关于这几个并发工具类,都要熟练掌握、熟练运用,还有很多并发工具类我没有全部列举出来,大家也需要多去学习与关注。多去了解与思考并发工具下,如何快速实现一个限流器?如何快速实现一个完备的缓存?该怎么利用这些工具类达到我们的目的。

  • 并发设计模式
  1. Immutability模式
  2. Copy-on-Write模式
  3. 线程本地存储模式
  4. Balking模式
  5. Thread-Per-Message模式

这些模式也需要去了解,自己要去逐步研究这些模式下的运用规律,应该如何利用这些不变性解决并发问题,以及模式规范实现等。

  • 案例分析
  1. 高性能限流器Guava RateLiniter
  2. 高性能网络应用框架Netty
  3. 高性能队列Disruptor
  4. 高性能数据库连接池HiKariCP

多去做一些案例分析,研究各个案例间的异同点,多看一些案例分析对以后上手做任务有好处,能在从中吸取经验。

  • 其他并发模型
  1. Actor模型:面向对象原生的并发模型
  2. 软件实务内存:借鉴数据库的并发经验
  3. 协程:更轻量级的线程
  4. CSP模型:Golang的主力队员

为了让大家更加系统的掌握理论知识,在这里给大家分享一篇有阿里p8大神耗时187天整理的《Java并发编程》。上述很多知识点都会在中涉及到,从基础、高级、实践的角度讲解Java并发,让你融汇贯通,形成全面系统的并发编程知识体系。最终可以得心应手地解决各种并发难题,同时将这些知识用于其他编程语言。一分辛劳,三分收获。

 

二、勤练代码

编程语言的学习是一个漫长的过程,欲速则不达,不可能一步登天,并且是没有捷径走的,所以我们唯一能做的就是坚持练习,在这个过程中慢慢积累经验,把基础打扎实。

学习Java理论知识是一项必不可少的内容,但是在理论学习时也要同时开始动手敲代码,别等到完全理解才动手,因为在程序运行中的各种情况都能帮助你快速理解,让你更快更牢固地掌握知识点。只有保证每天都有一定的代码练习量,在遇到问题时才会有解决问题的思路。

然后不要认为写出了一个简单的小程序,就觉得自己已经学得非常好了,这只是编程学习过程中的一个小小实践,要达到独立做项目的程度还差一大截。

 

三、多做项目

对于学习不能只停留在理论以及基础代码,这样只会是纸上谈兵,起不到任何的实际作用,想要真正能够运用到实际生活、工作当中去,你就得开始去做项目了。

真正做项目时候会遇到的难题会更多,需要在看去不断摸索与研究,可以多调试,多尝试用不用的方法实现,通过这样的练习方式,对于Java的理论与实践更加的融会贯通、运用自如,会非常熟练的掌握与运用Java,得到非常大的提升。

特别是自己认真的用代码做完一个项目之后,你会非常的有成就感,心里说不出的喜悦,这个时候就要恭喜你,差不多已经掌握了Java这项语言。

 

四、经验总结

自己要在学习与实践中去总结经验,无论是成功的或是失败的,自己的或是他人的,都要照收不误,从失败的经验中吸取教训,在成功的经验中做更多的尝试,获得更多的成功。

我也给大家分享几点我的经验:

  1. 在代码的练习和做项目的时候,一定要注意代码保持规范性,细致了解代码机制,否则可能会导致整个项目发生错误。
  2. 不断建立自己的人脉圈,不断去结识新朋友,构建属于自己的Java学习圈,
  3. 最后也是非常重要的一点,确保基础知识的扎实性,提升自己分析问题、解决问题的能力,学无止境,强大到自己也能帮助别人解决问题,成为大佬级人物。

 

 

五、学习是最美好的字眼!

如今的互联网大环境遍地裁员,焦虑人人都有。你要做的,只是在一家公司深耕一段时间,等能力、时机皆成熟,再抬头看看外面的世界,你会发现自己的眼界和实力已经不可同日而语。

这里是一篇大神耗时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 总结
在这里插入图片描述

 

正文在这里结束。因为文章内容实在是太多了,不能够给大家一 一体现出来,每个章节都有更加细化的内容。大家需要完整版文档的小伙伴,可以 一键三连点击我免费获取

 

原文链接:https://blog.csdn.net/m0_57711043/article/details/117806481



所属网站分类: 技术文章 > 博客

作者:我很伤感

链接:http://www.javaheidong.com/blog/article/222624/207b326f6bda6501fbbd/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)