来自一位架构师的分享,学习Java多线程的一些总结

4年Java开发经验裸辞之后闭关修炼2个多月,成功拿下美团、京东、字节跳动(Java架构师)offer。 写在前面 本人4年java开发经验,从上家公司离职之后恰巧碰上疫情就在家闭关修炼!没日没夜的苦修2个多月,面试了几家公司,最终拿下美团、京东、字节跳动(java高级工程师)offer。 我是如何拿下美团等大厂的offer的呢,今天分享我的秘密武器 我把一位 蚂蚁金服资深架构师 整理的【Java核心知识点整理】资料啃完了,这份资料是我看到过整理得最全面、知识点解析得最透彻的一份java架构进阶资料。其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、 阅读详情

Java多线程的应用复杂性之如jvm有限的几个内存方面的操作和规范,就像无数纷繁复杂的应用逻辑建立在有限的指令集上。


如何写出线程安全的程序,有各种各样需要遵循的规则,如果硬是去记忆这些写法或者规则,就事倍功半了,最好是先学习原理,抓住问题的主干,再拓展细节,这也是大家公认的学习某种技术的方式。对于多线程的问题,java使用java内存模型 JMM来保证多个线程可以有效地,正确地工作。

学习的步骤可以分为:

关注大师的言行,跟随大师的举动——JUC包已经足够丰富,按照API规范正确使用。

和大师一起修行——理解多线程问题的由来,以及jvm给出的解决方案,需要理解java的内存模型JMM,以及JMM给出的线程工作内存与主内存交互的规则如何形成JMM的happens-before原则等。参考书有知名的《深入理解Java虚拟机》第12章,最重要的《JSR-133 Java内存模型与线程规范》以及《并发编程实战》第16章。

领悟大师的意境——JUC包的实现原理,volatile和CAS构筑了JUC包的基础类,AQS,非阻塞数据结构,原子变量,这些基础类又构建了JUC包的高层类,Lock,同步器,阻塞队列,并发容器,Executor等。理解了高层类的原理,能够心里有底地使用这些类,构建健壮的应用。

成为真正的大师——学习JUC包的实现,说不定哪天也能写出一样优秀的类。

一些背景知识:

1. 操作系统中线程的实现

现代操作系统的线程主要有三种实现:内核线程实现,用户线程实现,混合实现

内核线程(KLT):线程表由内核维护,由内核完成线程的切换,内核通过调度器对线程进行调度,并将线程的任务映射到处理器上,每个内核线程可以视为内核的一个分身。程序一般不会直接使用内核线程,而是使用内核线程的一种高级接口——轻量级进程(LWP)(广义上来说,轻量级进程也是在用户空间的进程中的,所以也是一种用户线程)。LWP和KLT是一一对应的,是1:1的关系,因此也叫作一对一线程模型(1:1)。内核线程最大的特点就是,如果有轻量级进程发生了阻塞,不会影响整个进程的工作,内核会运行其他可运行的线程。缺点也是明显的:各种线程操作都需要系统调用,需要在用户态和内核态进行来回切换,代价高昂,而且因为占用内核空间,所以内核能支持的数量是有限的。

用户级线程(UT):狭义上的用户线程是指,完全建立在用户空间的线程库上,由所在进程实现管理的线程。最大的亮点在于可以在不支持多线程的操作系统之上实现多线程,如DOS,同时因为不需要切换到内核态,所以快速且低消耗,也能支持更大规模的线程数量。这种模型中,一个轻量级进程对应多个线程,因此叫做一对多线程模型(1:N),用户进程的优势在于不需要内核的支援,而因为没有内核的支援,所有的线程操作都需要用户自己处理,导致复杂性是其劣势。线程的创建,切换,调度都是需要考虑的问题,现在使用用户线程的程序已经越来越少了。java线程在JDK1.2之前,使用用户线程。

用户线程+轻量级进程的混合实现:使用轻量级进程作为用户线程和内核线程的桥梁的一种实现,用户线程和轻量级进程的比例不定,因此也叫多对多线程模型(N:M),UNIX家族中的Solaris提供了N:M的线程模型实现。

更详细的说明可以查看介绍操作系统的书籍。

2. java虚拟机中线程的实现

jdk1.2 之前,java使用的是称为“绿色线程”的用户线程,而在1.2中,线程模型替换为基于操作系统原生线程模型来实现

操作系统支持什么样的线程模型,很大程度上影响java的线程模型,windows和linux系统提供的线程模型是1:1的,所有这两个平台上的JDK使用的是1:1的线程模型,一个java线程映射到一个轻量级进程中,Solaris系统同时支持1:1和N:M,该平台中的JDK可以指定参数选择线程模型。

操作系统的线程特性会对线程的并发规模和操作成本产生影响,但是对java程序的编写和运行来说是透明的。

3. 多线程环境下的一些问题:

安全性问题:在没有正确同步的情况下,多线程环境下程序可能得出错误的结果。

活跃性问题:在多线程环境下,当某个操作应该继续执行却无法继续执行下去,就造成了活跃性问题,如:死锁,饥饿,活锁。

性能问题:线程的频繁切换将带来极大的开销,如:

保存和恢复执行上下文,丢失局部性

使用同步机制的时候,这些机制会抑制某些编译器优化以保证执行顺序,

如使用volatile保证可见性的情况下,使内存缓冲区中的数据无效,其他线程需要重新从主内存中加载

所有这些因素会带来额外的性能开销。

4. 一些相关概念

竞争条件:多线程的环境下,程序执行的结果取决于线程交替执行的方式。而线程的交替操作顺序是不可预测的,如此程序执行的结果也是不可预测的。

状态:状态在多线程编程中是一个很核心的概念,因为线程安全性的核心就在于:对可变的共享状态的访问操作进行正确的管理。

非正式的定义:状态可以简单理解为存储在对象的域中的数据,下面的Counter类中的count就是一个Counter对象的状态。如果不能正确地访问和修改count,那么count的值就不具备正确性。状态也包括一个对象依赖的对象的域。

多线程的环境下,主要是可变的,共享的状态会导致安全性问题,可变意味着状态可以被修改,共享意味着可以被多个线程改变,自然而然的,有三种方法来解决这个问题:1.让对象不可改变 2. 让状态不可共享 3. 必须共享和改变的,使用某种机制来保证顺序——同步。

或者更加直接可靠的,不要给对象状态,一个没有状态的对象一定是线程安全的。

线程安全性:当多个线程访问某个类的时候,这个类始终能表现正确的行为,那么这个类是线程安全的。

public class Counter {
	private long count = 0;
	public long getCount(){
		return count;
	}
}
高级JAVA互联网架构师全套视频教程 目录如下: 一、互联网并发编程 二、互联网网络通信编程 三、JAVA虚拟机 四、Linux部分 五、数据库设计与优化 六、互联网中间件架构设计 七、互联网框架应用 八、互联网分布式综合项目实战 立即下载

相关推荐

Python爬虫实战:5分钟搞定政府网站公开数据抓取(附完整代码)

本文详细介绍了如何使用Python爬虫快速抓取政府网站公开数据,包括环境配置、网站结构分析、请求头构建、数据处理与存储等关键步骤。通过实战案例和完整代码,帮助开发者高效获取结构化数据,适用于数据分析、市场研究等场景。

weixin_29057065的博客 941

多线程并发库(一)

ThreadLocal是线程局部变量。在多线程中,实现每个线程中变量的私有性。例子一在该例子中,在同一个线程中通过调用类A和类B的getData()方法获取的数据是一致的。public class ThreadLocalTest { static ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); public static void ma

u011521890的专栏 1201

【WPF】渲染失败甚至程序崩溃,D3DImage.Lock卡死,报COMException异常和UCEERR_RENDERTHREADFAILURE消息

最近遇到WPF程序抛出ystem.Runtime.InteropServices.COMException异常,异常消息UCEERR_RENDERTHREADFAILURE (Exception from HRESULT: 0x88980406),或者先在D3DImage.Lock卡死,然后再出异常的问题。 现象和复现方法 出现了标题中的现象,你很可能有至少两个屏幕,并且可能在你的程序中直接或间接用了如下的库或技术: 1、WpfD3D这个开源库 2、自行使用了WPF中的D3DImage类,实现D3D

几罗星人的专栏 8254

Java高级开发必会的50个性能优化的细节(珍藏版)

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。●1. 尽量在合适的场合使用单例使用单例可...

java面试笔试 458

【深大计算机网络】实验三 可靠传输机制 实验报告 附代码

【内附代码】【深大计算机网络】实验三 可靠传输机制 实验报告 附代码

m0_74268508的博客 1654

SAP 接口测试操作-业务顾问

业务顾问测试接口操作

weixin_43657667的博客 5163

等学完全套java互联网架构师课程,你说能值20K不?

FUSIPING的博客 748

单晶塑性abaqus-umat自学

单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量

Niklas4088的博客 1万+

《JAVA互联网架构:二期》架构师精品视频课程(免费不加密)

《JAVA互联网架构:二期》架构师精品视频课程 跟着真正的互联网应用架构师,学习互联网应用架构师方向开发!可能你还为工作不好、薪资待遇不高感到烦恼,可能你还在纠结自己的技术水平不够找不到高大上的工作而烦恼,那么在这里我们推出互联网应用架构师课程学习体系面向所有想要学习高端技术,并且以后想要从事互联网行业开发的“同学”,真正做到在公司中实际使用,解决公司中实际问题,让你一步进入高大上的集体,感受...

chenhuakang的博客 5181

WinForm轻松打造AntDesign现代化工具栏

摘要: 本文介绍如何在WinForm中利用AntdUI库实现AntDesign风格工具栏,包括安装配置、动态生成按钮/下拉菜单、布局优化及主题美化。通过AntButton、AntDropdown等控件结合事件绑定,可快速构建支持图标、工具提示、权限控制的现代化工具栏,并解决常见图标加载、布局错乱问题。最后提供代码示例与响应式设计技巧,助你打造高效美观的WinForm界面。 (字数:150)

java专栏 1595

实用电路精讲系列---ACDC开关电源

AC/DC开关电源工作原理及应用解析 AC/DC开关电源通过高频开关技术将交流电转换为稳定直流电,核心流程包括整流滤波、高频开关转换、反馈稳压和隔离保护。典型应用涵盖智能断路器、车载充电机、光伏逆变器等多个领域,采用不同拓扑结构和功率器件满足各场景需求。文章详细分析了基于LT1103的实用电路,包含输入整流、开关稳压、多级滤波等关键模块,并阐述了同步整流和多级滤波对提升效率稳定性的作用。这种电源技术通过高频开关切换+变压器耦合+闭环反馈,实现了高效紧凑的电能转换,在各工业领域具有广泛应用价值。

weixin_40590799的博客 2587

从某度外包逆袭成为阿里架构师,分享我的Java进阶成长笔记

写在前面 我的一位朋友在某大型互联网公司担任架构师。刚毕业那年,他以外包的身份进入了某度,那个时候他几乎每一天都很焦虑,大家技术能力没差太多,为什么“我”是外包身份? 后来辞职,去了一家 20 人左右的创业公司,担任技术主管。由于团队不大,他毕竟有大厂的落地经验,也很年轻比较有想法,带了2、3个人把自己的想法基本都落地了。某一些时刻还是很满足当时的状态,毕竟压力不大,薪资也不错。 有一次和大学同学聚会,和几个在BAT的同学聊了聊技术,发现“自己”在创业公司这几年,完全是吃老本的状态,一直在纯输出,创业

一入Java深似海 463

【系统移植】 移植主线U-Boot(v2024.01-rc3)到RK3399

[系统移植] 移植主线U-Boot(v2024.01-rc3)到RK3399

Systemcall名屋 1004

45天啃透这本阿里P8架构师整理的Java核心学习笔记,连收7个Offer

一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。而我比较幸运,有幸获得了来自阿里P8架构师分享的Java核心学习笔记,花了一个半月的时间学习,之后面试信心满满,陆续拿到了京东,美团,阿里等大厂的七个Offer。在此把笔记分享出来,希望能帮到更多爱学习的人,也助更多的人能在面试当中顺利拿到Offer,进自己所钟意的大厂,做更好的自己。某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我。

jcc4261的博客 952

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

阿里资深架构师总结JDK源码学习宝典,源码学习竟然有捷径

好了,本文到这里就结束了以上就是阿里资深架构师老哥总结的《JDK源码剖析学习宝典》的大致内容了,可以说是对大家学习源码道路上的“坑”基本可以绕开。最后送大家一句话:技术永远是程序员最好的炼金石,技术在手,无惧寒冬!文中资料已整理打包存放网盘,有需要完整版PDF的朋友可以点击下方的名片自取!

m0_73311735的博客 175

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

在Github上标星83.6K,Java面试:Xmind+笔记+视频,这一篇就够了!

牛皮!Java架构师“神秘宝典”,助我斩获七家大厂Offer 007小迁2020-09-30 15:57:27 2020年9月27日这是我收到第七个大厂Offer——蚂蚁金服的Offer!能收到这么多的大厂Offer其实和自己的努力是离不开的,基于这个基础之上,其实自己有一个非常完整知识体系和完整的学习里面同样十分重要! 基础以上条件自己整理了一份Java架构师宝典(涵盖了Java全栈知识点总结和脑图) 下面为大家一一呈现出来,由于架构宝典的涵盖的内容太多,小编没办法全部展示出来,只能挑重点去呈现.

+W❤:bjmsb2019 284

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

十年程序人生路,他是如何从某度外包逆袭成为阿里架构师的?

写在前面 我的一位朋友在某大型互联网公司担任架构师。刚毕业那年,他以外包的身份进入了某度,那个时候他几乎每一天都很焦虑,大家技术能力没差太多,为什么“我”是外包身份? 后来辞职,去了一家 20 人左右的创业公司,担任技术主管。由于团队不大,他毕竟有大厂的落地经验,也很年轻比较有想法,带了2、3个人把自己的想法基本都落地了。某一些时刻还是很满足当时的状态,毕竟压力不大,薪资也不错。 有一次和大学同学聚会,和几个在BAT的同学聊了聊技术,发现“自己”在创业公司这几年,完全是吃老本的状态,一直在纯输出,创业

JavaBUGa的博客 1420

阿里10年架构师:由Java多线程+MySQL+JVM出发怎样做好职业规划?

每个程序员,或者说每个职场人都应该有自己的职业规划,如果你不是富二代,也不是官二代,也没有明确的的职业规划,那么希望你可以思考一下自己的未来。毕竟人生是你自己的。下面,笔者分享一位在阿里任职的朋友的职业经历,看他是如何一步步稳步晋升的。怎么样?这样的人生你是不是很向往呢?我身边大部分的程序员,基本上都有想进大厂的梦想,说的高大一点是实现梦想,倍感荣光,实际上也是因为大厂的薪资待遇,也是一般小公司不能比拟的。在这里没有唯金钱论的意思。俗话说:“人往高处走,水往低处流”。在大的平台,你也会拥有更多的机会,更广阔

m0_67617438的博客 315

2021Java常见面试题:关于Java开发的面试经验总结

前言 受到疫情影响我从过完年一直呆在家里,索性学点知识方便以后跳槽涨薪,于是从二月份开始学习阿里P8架构师纯手打的一份Java面经手册,没想到5月初我成功从我们三线的一个小公司跳槽进了腾讯,虽然等级不高,但是涨薪还是涨了8K,而且去一个大公司多学点东西,对自己的成长还是有好处的。 虽然说是面经手册,但是里面的涵盖的知识点还是很全面、很细的,一共分了一下十几个大部分:java基础、集合类Set、锁volatile synchronized Lock ReentrantLock AQS C、java多线程:、J

m0_57501956的博客 180

公司新来的00后真是卷王,工作没1年,入职18K

都说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作都没1年,到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条件不太好,一大家子指望他一个人养活,所以他再大三的时候就已经开始自学Java了,大四获得了一个小公司的实习机会。在工作中不断的学习、实践,花的时间比别人多一倍,所以才能打下扎实的基础,现在工作也是得心应手。 我认为这位小老弟正式我们学习的榜样,倒不是说应该学习他加班内卷,而是

Java大将军的博客 4639

Java面试前的敲门砖:多线程+微服务spring源码+Redis+docker+Git

本着现在找工作也不容易,加上网上很多吐槽,说面试造火箭的,于是这次面试我就把提问的主动权交给候选人,让他挑自己擅长的知识点来自问自答。 有这么一位程序员印象最深,他也选择了几个熟悉的技术点,例如微服务,多线程,Redis,spring源码,docker等。但是在面试中依然停留在表面的概念,对于一些优化和细节回答的支支吾吾! 最让我感触深刻的是他面试结束后的反问: 我日常工作中的开发需求排的很满,每天都要加班到很晚,能实现功能不出BUG就可以了,哪有时间研究这些技术细节,碰到不会的时候Google一下

代码界的扛把子 604

4年Java开发经验,从传统公司裸辞之后足足准备了3个月,终于拿到美团、京东、字节跳动等大厂offer

写在前面 本人4年java开发经验,从上家公司裸辞之后就在家闭关修炼!没日没夜的苦修2个多月,面试了几家公司,最终拿下美团、京东、字节跳动(java高级工程师)offer。 我是如何拿下美团等大厂的offer的呢,今天分享我的秘密武器 我把一位 蚂蚁金服资深架构师 整理的【Java核心知识点整理】资料啃完了,这份资料是我看到过整理得最全面、知识点解析得最透彻的一份java架构进阶资料。其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、

JavaBUGa的博客 683

程序员提升方略

为什么80%的码农都做不了架构师?>>> ...

weixin_34148508的博客 93

“从Crud到阿里P7,汗水铸就辉煌 —— 努力是逆袭的唯一密码“

我的故事平凡而真实,作为一名拥有1年半Java开发经验的普通本科生,我从一所不起眼的二本院校毕业,便投身于日常的Crud工作,日复一日地在这条流水线上辛勤耕耘。出身于小镇的我,深知努力的意义,因为我知道,对于没有背景和资本的人来说,勤奋是改变命运的唯一途径。曾经,我对“幸运女神眷顾努力的人”这句话抱有怀疑,但当我真的遇到了好运,我开始相信这句话的力量。这份好运,便是朋友慷慨分享的——一位阿里巴巴P8架构师精心编写的999页学习笔记,这份笔记对标阿里P7的技术标准。

weixin_42924914的博客 371

Java 领域 offer 收割:程序员黄金 5 年进阶心得!

怎样才能拿到大厂的offer?没有掌握绝对的技术,那么就要不断的学习。如何拿下阿里等大厂的offer的呢,今天分享一个秘密武器,资深架构师整理的Java核心知识点,面试时面试官必问的知识点...

AI科技大本营 316
上一篇: 如何从 Java 8 升级到 Java 12,升级收益及问题处理技巧
下一篇: 面试这样回答Java调优,至少加1000块!!!
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值