《Java并发编程实战》第十六章 Java内存模型 读书笔记

《Java并发编程实战》第十六章 Java内存模型 读书笔记

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。


Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究。

一、什么是内存模型,为什么须要它

Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规范、一致性等都来自于JMM。


1 平台的内存模型
在架构定义的内存模型中将告诉应用程序能够从内存系统中获得如何的保证,此外还定义了一些特殊的指令(称为内存栅栏或栅栏),当须要共享数据时,这些指令就能实现额外的存储协调保证。
JVM通过在适当的位置上插入内存栅栏来屏蔽在JVM与底层平台内存模型之间的差异。

2 重排序
多个线程同一时候操作同一个变量时,读与写必须保证原子性,否则会出现读取的变量值并非最新改动的等重排序问题。


3 Java内存模型简单介绍
Happens-Before的规则包含:

程序顺序规则。假设程序中操作A在操作B之前,那么在线程中A操作将在B操作之前运行。

监视器锁规则。在监视器锁上的解锁操作必须在同一个监视器上的加锁操作之前运行。

Volative变量规则。对Volative变量的写入操作必须在对该变量的读操作之前运行。

线程启动规则。在线程上对Thread.Start的调用必须在线程中运行不论什么操作之前运行。

线程结束规则。在线程中的不论什么操作都必须在其它线程检測到该线程已结束之前运行,或者从Thread.join中成功返回,或者调用Threas.isAlive时返回false。

中断规则。当一个线程在还有一个线程上调用interrupt时,必须在被中断线程检測到interrupt调用之前运行(通过抛出InterruptedException,或者调用isInterrupted和interrupted)。

终结器规则。对象的构造函数必须在启动该对象的终结器之前运行完毕。

传递性。假设操作A在操作B之前运行,而且操作B在操作C之前运行,则操作A必须在操作C之前运行。


4 借助同步
在类库中提供的其它Happens-Before排序包含:

将一个元素放入一个线程安全容器的操作将在还有一个线程从该容器中获得这个元素的操作之前运行。

在CountDownLatch上的倒数操作将在线程从闭锁上的await方法中返回之前运行。

释放Semaphore许可的操作将在从该Semaphore上获得一个许可之前运行。

Future表示的任务的全部操作将在Future.get中返回之前运行。

向Executor提交一个Runnable或Callable的操作将在任务開始运行之前运行。

一个线程到达CyclicBarrier或Exchanger的操作将在其它到达该栅栏或交换点的线程被释放之前运行。假设CyclicBarrier使用一个栅栏操作,那么到达栅栏的操作将在栅栏操作之前运行,而栅栏操作又会在线程从栅栏中释放之前运行。

二、公布

1 不安全的公布
除了不可变对象以外,使用被还有一个线程初始化的对象通常都是不安全的,除非对象的公布操作是在使用该对象的线程開始使用之前运行。

2 安全的公布

3 安全初始化模式

4 双重检查加锁

三、初始化过程中的安全性


參考资料:

《深入理解Java虚拟机:JVM高级特性与最佳实践》 第五部分 高效并发


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118104.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • k8s kubedns_docker+k8s

    k8s kubedns_docker+k8sK8s应用部署方式的演变kubernetes简介kubernetes组件kubernetes组件调用关系的应用示例kubernetes概念应用部署方式的演变应用部署方式的演变• 在部署应用程序的方式上,主要经历了三个时代:传统部署:• 互联网早期,会直接将应用部署在物理机上。• 优点:简单,不需要其他的技术参与。• 缺点:不能为应用程序定义资源的使用边界,很难合理的分配计算机资源,而且程序之间容易产生影响。虚拟化部署:• 可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境。

  • 结合matlab代码案例解释ICA独立成分分析原理「建议收藏」

    结合matlab代码案例解释ICA独立成分分析原理「建议收藏」目录介绍什么是ICA?对数据进行白化ICA算法ICA特性本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:941473018关于ICA,可以查看Rose小哥之前分享的《ICA独立成分分析去除EEG伪影》以及Scott等大神关于ICA的原理与应用的文献汇总《Scott等大神的33篇ICA独立成分分析论文汇总》。介绍独立分量分析是一…

  • [置顶] 微信开发出现“该公众号暂时无法提供服务,请稍后再试”的坑

    [置顶] 微信开发出现“该公众号暂时无法提供服务,请稍后再试”的坑

  • iOS5完美越狱后必装AppSync补丁教程

    iOS5完美越狱后必装AppSync补丁教程  iPhone4等设备完美越狱终于发布,不过完美越狱完成后如果给iPhone上安装从iPhone中文网或者其他网站上下载ipa后缀格式的软件和游戏,还有一项重要的工作就是在CYIDIA上安装ipa补丁AppSync5.0+,下面就教大家怎样安装。第一次进入Cydia程序需要选择“用户”,点击右上角“完成”选择界面底部的“管理”菜单,选择“软件源”菜单点右…

  • c语言爱心代码详解_C语言程序源代码

    c语言爱心代码详解_C语言程序源代码1、love图案的C语言爱心代码C语言爱心代码如下:#include<stdio.h>intmain(){inti,j,k,n=0,x=0,y=50;//爱心的头部没有规律,所以直接打印printf(“\n\n\n\n\n”);printf(“lovelovelovelove\n”);printf(“lovelovelove

    2022年10月13日
  • 如何解决Linux 系统下 ifconfig 命令无网络接口 ens33[通俗易懂]

    如何解决Linux 系统下 ifconfig 命令无网络接口 ens33

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号