图灵学院java架构师vip

caier-20 我们一起努力,一起学习,加油! caier-20

微云学习地址:https://share.weiyun.com/5mokPqU

网盘学习地址:https://pan.baidu.com/s/1CTx5SqUeM-ZKtDYLeovODQ 提取码:iclq

致学者:不论你在什么时候开始,重要的是开始之后请不要停止。

ava Memory Model,简称JMM,把它抽象成一种规范,用工作内存与主内存这两个概念。在JMM中主内存属于共享数据区域,从某个程度上讲应该包括了堆和方法区,而工作内存数据线程私有数据区域,从某个程度上讲则应该包括程序计数器、虚拟机栈以及本地方法栈。
主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存完成。

2. 八大原子操作
我们已经清楚,每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,线程与主内存中的变量操作必须通过工作内存间接完成,主要过程是将变量从主内存拷贝到每个线程各自的工作内存空间,然后对变量进行操作,操作完成后在某个不确定时刻再将变量写回主内存。这里再说具体一点,八大原子操作。

(1)lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态
(2)unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
(3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
(4)load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
(5)use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎 (6)assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
(7)store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
(8)write(写入):作用于工作内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中

3. 可见性/原子性/有序性

可见性/原子性/有序性是并发编程的三大特性。前面1,2点相当于对第一篇文章做了个复习和补充,接下来分析一下实实在在的代码。

4. volatile关键字
volatile关键字就是第一篇文章说的缓存一致性协议的一种实现方式,缓存一致性协议就是volatile关键字的方法论。

(1)保证可见性
volatile关键字保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值立即被其他的线程看到,即修改的值立即更新到主存中,当其他线程需要读取时,它会去内存中读取新值。(synchronized和Lock也可以保证可见性,因为它们可以保证任一时刻只有一个线程能访问共享资源,并在其释放锁之前将修改的变量刷新到内存中。)

那我们再来分析下。在上面的例子中,如果initFlag用volatile修饰,线程A把标志位刷新了,true值立即更新到主存中,线程B工作内存中的值同时失效。那线程B再想读,就只能从主存中去取,于是能正常停止。

(2)保证有序性
先说说概念。举个例子,如果变量i用volatile修饰:volatile int i=0;
i=10; //这叫volatile写
另一个变量=i; //这叫volatile读
不用volatile修饰的变量的读写叫普通读写

5. synchronized关键字
volatile关键字也没有保证原子性。
实际上,所有的并发模式在解决线程安全问题时,采用的方案都是序列化(一个一个来)访问临界资源(多个线程同时访问同一个共享、可变资源的情况, 这个资源我们称之其为临界资源)。即在同一时刻,只能有一个线程访问临界资源,也称作同步互斥访问。synchronized关键字是同步互斥访问方法之一(还有Lock,之后章节会手撕源码)。
怎么使用这些基础就不讲了,直接讲原理。synchronized关键字被编译成字节码后会被翻译成monitorenter和monitorexit两条指令分别在同步块逻辑代码的起始位置与结束位置。

那么这个是干嘛的呢?让每个线程在进入同步代码块或是同步方法时,去这个同步对象的对象头里去找monitor指针,目的是找到monitor对象(每个对象在创建时都会有一个与它对应的monitor对象),看里面的信息,判断可不可以申请到对象的锁。

(1)对象头是什么?——了解对象的内存布局
HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头 (Header)、实例数据(Instance Data)和对齐填充(Padding)。
对象头:比如 hash码,对象所属的年龄,对象锁,锁状态标志,偏向锁(线程)ID,偏向时间,数组长度(数组对象才有)等
实例数据:即创建对象时,对象中成员变量,方法等
对齐填充:对象的大小必须是8字节的整数倍

(2)偏向锁:如果线程1申请锁,获得了锁,那么锁就进入偏向模式,此时Mark Word 的结构也变为偏向锁结构,当这个线程再次请求锁时,无需再做任何同步操作,即获取锁的过程,这样就省去了大量有关锁申请的操作,从而也就提供程序的性能。如果线程2想要访问同步代码块了,会尝试修改一下对象头里面的线程id为自己(想让这个对象偏向自己),可能修改成功(线程1已经释放锁);可能失败(线程1还占有着锁),这时线程2向虚拟机发出申请说,让线程1这次时间片用完了停一停,我要用了。

原文地址:https://www.cnblogs.com/qq2365217564/p/12556204.html

时间: 2024-10-09 09:42:35

图灵学院java架构师vip的相关文章

图灵学院Java架构师-VIP-并发编程(AQS详解)

1.LockSupport LockSupport类的核心方法其实就两个:park()和unark(),其中park()方法用来阻塞当前调用线程,unpark()方法用于唤醒指定线程 LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能,可以把许可看成是一种(0,1)信号量(Semaphore),但与 Semaphore 不同的是,许可的累加上限是1. 初始时,permit为0,当调用unpark()方法时,线程的permit加1,当调用park()方法时,

Java架构师VIP课程图灵学院分享

1.熟悉各种框架并且知道他们的原理 2.熟悉虚拟机JVM 并且知道调优方式 能写出更优质的代码 3.连接池等池技术,反射机制 4.nio技术等 5.数据算法结构 sql等 6.熟练linux操作系统 7.各种网络协议 8.集群 9.中间件 图灵学院java架构师课程链接: https://pan.baidu.com/s/1cn5lB7eMSUCsr5CEOkeZTw 提取码 :818j 原文地址:https://www.cnblogs.com/qq-871211680/p/11916918.ht

Java架构师VIP课程一期共89G视频教程 luban it教程

集数合计:14讲Java视频教程详情描述: A0505<Java架构师VIP课程一期共89G视频教程>Java架构师VIP课程一期共89G视频教程 鲁班学院 课件资料全Java视频教程目录: 百度网盘下载点击 ├─撸搬架构├─01.并发专题(一)│      2018-09-11(1)-Java内存模型│      2018-09-13(2)-synchronized原理│      2018-09-16(3)-volatile实现机制│      2018-09-18(4)-DCL-单例模式

鲁班 Java架构师VIP课程一期共89G视频教程 luban it教程

Java视频教程详情描述: A0505<Java架构师VIP课程一期共89G视频教程>Java架构师VIP课程一期共89G视频教程 鲁班学院 课件资料全Java视频教程目录 ├─撸搬架构├─01.并发专题(一)│      2018-09-11(1)-Java内存模型│      2018-09-13(2)-synchronized原理│      2018-09-16(3)-volatile实现机制│      2018-09-18(4)-DCL-单例模式│      2018-09-21(

鲁班学院最新架构师资料《Java架构师VIP课程》

鲁班学院最新架构师资料<Java架构师VIP2019课程一期> 课程目录: ├─01.并发专题(一) │ 2018-09-11(1)-Java内存模型 │ 2018-09-13(2)-synchronized原理 │ 2018-09-16(3)-volatile实现机制 │ 2018-09-18(4)-DCL-单例模式 │ 2018-09-21(5)-并发基础-AQS.CAS2 │ 2018-09-25(6)-并发集合 │ 2018-09-27(7)-原子操作-基本类型 │ 2018-09-3

图灵学院java架构之路-VIP(五)nginx的安装和基本配置

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Unix工具软件.应用程序和网络协议.它支持32位和64位硬件.Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统. 一,安装环境准备: 1.linux 内核2.6及以上版本:使用uname -a查看即可. 2.GCC编辑器. GCC可以用来编译C语言程序.Nginx没有直接提供二级制可执行程序,只能下载源码进行编译

怎么成为java高级架构师?图灵学院总结的java架构师学习路线

怎么成为一个java高级架构师呢?相信这是很多java从业者,又或者说是coder/码农们比较感兴趣的问题,要回答这个问题,首先需要明白的是java架构师是什么?简单点说,架构师的主要任务不是从事具体的软件程序的编写,而是从事更高层次的开发构架工作.主要着眼于系统的"技术实现",工作内容就是确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员,并且需要有良好的组织管理能力.因此应该是特定的开发平台.语言.工具的大师,对常见应用场景能马上给出最

【图灵学院】Java架构师要掌握哪些技能?你所不知的十五条秘密

苦苦工作累积经验,却还是奋战在一线的"菜鸟"码农,不知道成为Java架构师要掌握哪些技能?熬不完的夜,想要升职加薪?看了很多书还是写不出最高效的代码,花了很多钱学习网课还是不见成效?遇到我图灵学院江南老师那就对了,少侠我看你骨骼清奇,是个奇才,请收下我深藏已久的升(kui)职(hua)宝典. 成为Java架构师要掌握哪些技能?请看下面这十五条: 1.想成为Java架构师,首先你要是一个高级java工程师,熟练使用各种框架,并知道它们实现的原理: 2.掌握jvm虚拟机原理.调优,懂得jv

十年阿里java架构师的六大设计原则和项目经验

先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Responsibility Principle - SRP) 原文:There should never be more than one reason for a class to change. 译文:永远不应该有多于一个原因来改变某个类. 理解:对于一个类而言,应该仅有一个引起它变化的原因.说白了就是