如何学习Java并发编程

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

2012年我刚转行到互联网,那年夏天我从传统通信行业跳槽到互联网行业。现在回忆起来,真的很感谢自己的决定,除了感谢自己还记得3件事:晴朗的天空、拥挤的地铁以及《一人之下》。

那是我成年后看的第一部国产动画片,可谓惊为天人。里面有所谓的八奇技,其中有一门绝技称为:术之尽头,炁体源流。虽然目前作者还没有揭开谜底,但从定义上来说,炁体源流大概有“追本溯源,回归本质”的含义。

为什么扯这些呢?

很多人学不好Java并发编程,恰恰是因为没有抓住本质。这一部分人学习Java并发编程时,往往都是东一榔头西一棒槌,今天看看Thread,明天学学CountDownLatch,后天又听说线程池不错,最后发现脑中一团浆糊,啥也没记住。

Java为什么能长盛不衰20余载?这大概与它对并发编程的良好支持有一定关系。我目前所在的电商公司早期用的是PHP,开发效率极高、调试简单,在创业初期立下汗马功劳。但随着公司业务高速发展,用户量快速攀升(虽然不知巅峰时期的活跃用户数,但单个业务线的用户表已有9000w),PHP的缺点逐渐暴露。首先是工程大了以后,动态语言确实不太好管理;其次PHP是基于进程的,也就是说一次请求就是一个进程,即使你定义了类变量,也不会存在线程安全问题,但进程的开销要比线程大许多,相对来说性能会差些。

Java、C/C++都是基于线程的,在资源的分配上更快速、粒度更小,但这种做法真的百利而无一害吗?现实生活中并不存在天上掉馅饼的好事,编程世界里也是如此。以数据结构与算法为例,原则上不存在多、快、好、省的万全之策,要么时间换空间,要么空间换时间。Java、C/C++选择了线程,就注定要解决烦人的“线程安全问题”。所有支持多线程的编程语言,注定要在“如何利用多线程高效执行任务”与“如何避免线程安全问题”两座大山之间蜿蜒前行,也由此形成了“并发编程”这个细分领域。

Java并发编程发家史

Java开源至今20余年,对于并发编程的解决方案也在不断改进,所以我们必须承认学习Java并发编程是有一定难度的(这一拳,20年的功力你挡得住吗)。不过好在Java是一个开源项目,老外也知晓“众人拾柴火焰高”的道理,在Java发展的过程中请到了两位贵人。

Josh Bloch:

这位大佬,在JDK 1.2时引入了Java集合。对,就是那个Collection和Map。仔细想想,我们平时除了写new、for循环以外,就是在不断地创建集合容器...可见集合对于Java的重要性。另外,在JDK1.5这个重大版本更新时,Josh Bloch又为Java引入了诸多语言增强,包括拆装箱、foreach等新特性,这才有了我们Java人今天的快活日子啊!

Doug Lea:

JDK1.5注定是划时代的版本,即使是JDK1.8也不如JDK1.5来得惊艳,而JDK1.5的主要缔造者正是Doug Lea,江湖人称 道哥李。

道哥做了啥?让让,我要装逼了:

太多了,不截图了,总之你熟悉的原子类、线程池、ReentrantLock、CompletableFuture啥的都是老爷子写的,以及令人闻风丧胆、八股文必问的AQS也出自他老人家之手...

Doug Lea:傻了吧,整个JUC都是我写的 (墨镜表情包)。

英雄总是惺惺相惜,Josh Bloch和Doug Lea两位大神不仅互相欣赏,偶尔技痒还会结对编程。你问我怎么知道的?我就是那台计算机,当时在现场呢:

如何学习Java并发编程

鉴于大神的水平太高,强烈不建议一上来就去死扣ReentrantLock、AQS,我至今也没有看完AQS的全部代码。我的学习思路是:

  • 先理清楚知识脉络
  • 自顶向下学习并发编程
  • 适当了解底层原理

我个人对Java并发编程的知识分类如下:

那如何自顶向下学习呢?私以为要先了解并掌握多线程的基本用法,分清楚什么是线程、什么是任务,然后再顺着线程产生的问题,学习锁相关的知识。有了锁相关的知识后,再去了解同步工具、线程安全容器、阻塞队列等并发相关的工具。最后学有余力再去扣底层细节,比如CAS、AQS以及基于UnSafe的LockSupport等底层实现。

对于锁及同步容器,其实有一个非常核心的模型需要了解:管程。只有知道了它,才能理解synchronized为什么会提供wait()、notify()、notifyAll()等方法,以及ReentrantLock中的Condition到底是什么。当然,我们无需急躁,后面的章节会慢慢道来。

需要说明的是,在ReentrantLock出来之前,Java其实已经基于synchronized实现了一系列并发容器,比如Hashtable、Vector、Collections.synchronizedList()等。而JDK1.5则通过JUC包提供了新的同步容器,比如ConcurrentHashMap。无论并发容器还是同步容器,只是称谓和实现上的区别,本质还是为了解决并发下的线程安全问题。

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

进群,大家一起学习,一起进步,一起对抗互联网寒冬

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

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

相关文章

定义一个学生类,其中有3个私有数据成员学号、姓名、成绩,以及若于成员。 函数实现对学生数据的赋值和输出。

#include <stdio.h> // 定义学生类 typedef struct Student { int stuNum; // 学号 char name[20]; // 姓名&#xff0c;假设最长为20个字符 float score; // 成绩 } Student; // 初始化学生信息 void initializeStudent(Student *student, int num, const…

Office Tool Plus 使用教程 让个人也能轻松使用上免费的Office

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

接雨水-困难

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a;输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

忘记PDF密码了,怎么办?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

优雅草蜻蜓I即时通讯·水银版私有化部署之安卓Android端编译-02

Android 项目配置 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 使用以上Android studio版本 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 下载最低sdk最低版本28 完成后就可以导入项目(项目导入不能开VPN,会导致部分三方库…

一v一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

使用加密工具The Enigma Protector ,快速保护您的软件安全

我们多次被问到使用Enigma Protector保护软件免遭破解和逆向工程的最佳方法是什么&#xff1f;在这里我将解释保护常用应用程序的技巧是什么。 许多开发人员认为&#xff0c;如果他们只需单击“保护”按钮&#xff0c;保护程序就会自动完成所有操作&#xff0c;无需嵌入额外的…

【Java基础系列】JavaWeb入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

「C++」哈希表的实现(unordered系底层)

&#x1f4bb;文章目录 &#x1f4c4;前言哈希表概念哈希函数 哈希冲突闭散列开散列 &#x1f4d3;总结 &#x1f4c4;前言 unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构&#xff0c;使其在查找上的时间复杂度几乎减低到了 O ( 1 ) O(1) O(1)。 哈希…

企业ERP软件定制开发的重点|app小程序网站建设

企业ERP软件定制开发的重点|app小程序网站建设 随着企业信息化程度的不断提高&#xff0c;企业资源计划&#xff08;ERP&#xff09;软件成为了现代企业管理的重要工具。然而&#xff0c;由于不同企业的业务流程、组织结构和管理模式各异&#xff0c;现有的通用ERP软件无法完全…

基于若依的ruoyi-nbcio的flowable流程管理系统增加服务任务和我的抄送功能

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、增加一个状态字段 wf_copy增加下面两个字段 就用未读已读来区分 2、前端 api接口增加如下&#xff…

IDEA检查项目的jdk版本需要看的地方

IDEA检查项目的jdk版本需要看的地方 1、检查项目结构&#xff0c;如下图所示选择即可 选择了之后打开了如下界面&#xff1a; 下面的三张图全部都要检查选择jdk8的版本 2、进入设置&#xff0c;如下所示&#xff1a; 进入之后&#xff0c;根据下图&#xff0c;挨个选择&#xf…

「海蓝色」海关可视化监管平台,助力海关体系实现规范化程序管理

海关监管是国家对进出境货物、旅客和邮件进行检查和控制的重要机构&#xff0c;其职责是保障国家的安全和经济利益。海关监管的核心目标是防止非法进出境活动&#xff0c;包括走私、偷逃税款等行为。海关监管通过检查和核实货物的品质、数量和价值&#xff0c;确保货物符合相关…

SMART PLC编码器角度测量

编码器角度测量在倒立摆摆杆角度测量上的应用请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/131443657https://rxxw-control.blog.csdn.net/article/details/131443657线性模式下编码器旋转圈数和单圈计数值测量可以查看下面文章: https://rxxw…

C语言实现植物大战僵尸(完整版)

实现这个游戏需要Easy_X 这个在我前面一篇C之番外篇爱心代码有程序教你怎么下载&#xff0c;大家可自行查看 然后就是需要植物大战僵尸的素材和音乐&#xff0c;需要的可以在评论区 首先是main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏…

关于pycharm代码误删,本地历史恢复

关于pycharm代码误删&#xff0c;本地历史恢复 1.工作中或多或少的出现代码误删&#xff0c;或者其他原因导致我们的辛辛苦苦写的码子没了&#xff0c;一定很着急。 2.我们点击工作目录文件夹或者是项目内鼠标右击&#xff0c;找到local history 然后选择show history,就可以…

Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

一、Python安装 最新版Python下载地址&#xff1a;https://www.python.org/ 根据操作系统选择对应版本制品下载安装即可&#xff0c;本机用的是Windows x86-64 executable installer。 注意事项&#xff1a; 安装完成后检查下环境变量&#xff0c;默认会配置好&#xff0c;可…

算法初阶双指针+C语言期末考试之编程题加强训练

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼…

【链表Linked List】力扣-2 两数相加

目录 题目描述 解题过程 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 …

JVM GUI可视化监控及诊断工具

工具既述 使用命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限&#xff1a; 无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等&#xff08;这对定位应用性能瓶颈至关重要&#xff09;。要…