文档章节

身为JAVA工作者必须了解的实战知识(十五)

 叶荷
发布于 2017/08/31 20:11
字数 1432
阅读 4
收藏 0

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

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

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

1 平台的内存模型

在架构定义的内存模型中将告诉应用程序可以从内存系统中获得怎样的保证,此外还定义了一些特殊的指令(称为内存栅栏或栅栏),当需要共享数据时,这些指令就能实现额外的存储协调保证。

JVM通过在适当的位置上插入内存栅栏来屏蔽在JVM与底层平台内存模型之间的差异。

2 重排序

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

深入理解Java内存模型(二)——重排序

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之前执行。

深入理解Java内存模型(一)——基础

4 借助同步

在类库中提供的其他Happens-Before排序包括:

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

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

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

Future表示的任务的所有操作将在Future.get中返回之前执行。

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

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

二、发布

1 不安全的发布

除了不可变对象以外,使用被另一个线程初始化的对象通常都是不安全的,除非对象的发布操作是在使用该对象的线程开始使用之前执行。

2 安全的发布

3 安全初始化模式

4 双重检查加锁

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

好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。

注:加群要求

1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

PS:现在主要讲解的内容是(反射原理枚举原理与应用注解原理常用设计模式、正规表达式高级应用、JAVA操作Office原理详解JAVA图像处理技术,等多个知识点的详解和实战)

6.小号或者小白之类加群一律不给过,谢谢。

最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 24
码字总数 41519
作品 0
私信 提问
fbf的书单,欢迎分享,欢迎更新

本人看过的以下书值得推荐的,列出来的就是值得推荐的 这个颜色是一般推荐 这个颜色是强烈推荐 这个颜色是神作,收藏吧 物联网:生产力的变革 李虹著 开拓视野,一般 源码中国:全球IT外包新原...

fbf
2015/03/16
0
0
Java微信开发_00_资源汇总贴

1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E......

rayner
2017/08/07
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
07/25
0
0
Python爱好者要明确的未来方向

了解Python是什么? Python 这门语言它是面向对象编程语言,有封装强大的类库,Python目前已经超过了Java成为人们最喜欢的编程语言。相比Java,Python更加的容易理解、免费开源的代码、Pytho...

糖宝lsh
09/20
0
0
Java培训实战教程之Java基础知识精华部分(一)(二)(三)

Java培训实战教程之Java基础知识精华部分(一)_java概述 =============================================================================Java培训实战教程之Java基础知识精华部分(一)_java概...

黑泽明军
04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SonarQube+Scanners代码质量管理

简介 sonaqube是一个开源代码质量管理平台,致力于持续分析和测量技术质量。 系统构成 SonarQube平台由4部分组成: SonarQube服务器 Web服务器的开发者,管理者,浏览质量快照和配置SonarQu...

阿dai
56分钟前
0
0
mysql-router 8 yum安装

1.配置安装源 #配置MySQL5.7的安装源 #https://repo.mysql.com/mysql57-community-release-el7.rpm #https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm rpm -Uvh https:/......

MichaelShu
今天
0
0
     甲骨人-MySQL网络课-day03

===================================================================================== ======================= 第三章 mysql SQL语句 1、mysql接口自带命令 1.1、\h 或 help 或 ? 1.2、......

hnairdb
今天
0
0
Redis异构集群之间数据迁移方案

一、Redis集群迁移工具 最近在做Redis数据迁移,网上找了两款开源的Redis迁移工具。 第一种:redis-port Codis官方提供的一个工具,redis-port是一个Redis工具,通过解析rdb文件,实现Redis...

IT--小哥
今天
3
0
解压zip包(zip4j)

1:引入zip4j_1.3.2.jar 2:源码如下: package test;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import net.lingal......

uug
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部