JMM结构图:

JMM对同步的8种操作:

JMM的同步规则:

Countdownlatch介绍:

该类功能是可以阻塞线程,并在保证线程满足特定条件下,继续执行。如上图,Countdownlatch的cnt初始值是3,线程A调用await()方法,会阻塞,t1,t2,t3每次执行会将cnt-1,然后继续执行。直到cnt的值为0,则TA继续执行。

假设只有两个车道,同一地点,只能同时有两辆车通过,即并发就是两个。Semaphore优势是可以控制同一时间,线程的并发量。

原子性介绍:

先看看jdk中atomic包中的原子类:

看下图程序,拿atomicInteger

当调用count的incrementAndGet方法时候,内部调用下图所示方法:

Var1指的是count对象,

底层是compareAndSwapInt,该方法是个本地方法,从名字看出就是CAS操作。含义是拿到var2主内存的值和传入的var2值比较,如果相同,则执行相加操作。

atomicRefence的用法:

下图最后结果是4

AtomicIntegerFieldUpdater用法:

atomicBoolean里的cas,只能执行一次。含义是多个线程同时执行,只有一个线程执行该操作,其他线程不能执行。

比如下面代码结果一定是true,因为虽然有5000个线程同时运行,只有一个线程修改AtomicBoolean属性的变量

ABA问题:是指在某个线程CAS操作的时候,其他线程将A改成了B又改回了A,此时CAS发现A和底层的值A没有变。为了解决这个问题,

注:1.如果子类继承了父类,子类调用父类中synchronized方法,是没有同步效果的(synchronized不属于方法声明);、

2. synchronized,修饰非静态方法或者代码块时候,锁定的是调用的对象。一个类的两个不同对象调用该类的非静态同步方法,由于锁对象不同,是每个对象本身,所以是不起同步作用的。

如果修饰类或者静态方法或者静态代码块,锁定的就是这个类,此时,一个类的不同实例。两者很有区别。

原子对比:

下面介绍可见性:

Volatile可见性实现的方式(注意:volatile没有原子性)

实现原理概括就是,读取一个变量的时候,会强迫从主内存中读取该变量,而写一个变量的时候会强迫从线程工作空间刷新到主内存。具体如下:

关于有序性:

指令重排序不会影响单线程,但是会影响多线程

JVM的happend-before原则:

如果两个操作的执行,不能从happens-before原则中推导出来,那么就不能保证他们的有序性,虚拟机可以随意的对他们进行重排序。

JMM以及并发三大特性介绍(包括解决方案)的更多相关文章

  1. Java面向对象概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  2. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  3. Java面向基础概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  4. OOP三大特性及几大设计原则

    封装: 1.隐藏实现细节:2.恰当地公开接口:3.将接口和实现分开,增强可维护性:(实现细节改变时,使用该类的客户端程序不需要改变) 继承: 1.描述联结类的层次模型;2.通过抽象,表达共性,实现类的 ...

  5. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  6. Java 多线程:并发编程的三大特性

    Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...

  7. Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  8. Xcode9新特性介绍-中文篇

    背景: Xcode 9 新特性介绍: 1.官方原文介绍链接 2.Xcode9 be ta 2 官方下载链接 本文为官方介绍翻译而来,布局排版等都是按照官方布局来的. 与原文相比,排版上基本还是熟悉的配 ...

  9. JAVA多线程-内存模型、三大特性、线程池

    一.线程的三大特性 原子性.可见性.有序性 1)原子性,即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.原子性其实就是保证数据一致.线程安全一部分. 2)可见性,即 ...

随机推荐

  1. lazyMan

    class Lazyman { constructor() { this.tasks = []; this.init(); } init() { const task = () => { con ...

  2. Maven版本不一致的时候,使用指定版本进行编译

    最近用Maven打包项目(本地jdk11)后放到服务器(jdk8)后,报[java.lang.UnsupportedClassVersionError]版本不一致错误. 网上资料说是修改Intelli ...

  3. bugku web 变量1

    flag In the variable ! <?php error_reporting(0);include "flag1.php";highlight_file(__fi ...

  4. bzoj 3282: Tree (Link Cut Tree)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3282 题面: 3282: Tree Time Limit: 30 Sec  Memory L ...

  5. AttributeError: 'NoneType' object has no attribute 'split' 报错处理

    报错场景 social_django 组件对原生 django 的支持较好, 但是因为 在此DRF进行的验证为 JWT 方式 和 django 的验证存在区别, 因此需要进行更改自行支持 JWT 方式 ...

  6. Linux安装NodeJS

    Linux中安装nodejs 去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ ...

  7. postgreSql 基本操作总结

    0. 启动pgsl数据库 pg_ctl -D /xx/pgdata start     1. 命令行登录数据库 1 psql -U username -d dbname -h hostip -p po ...

  8. 移动开发day1_过渡_2d转换_3d立体

    今天是就业班开班的第一天,上完了一天的课,做点总结. 什么叫做移动web 专门在手机或者 平板电脑 浏览器网页 为什么要学习移动web 工资高 1. 人拥有的手机数 大于 电脑的个数 2. 微信 1. ...

  9. cmake 递归依赖

    现在有3个模块:main.service.base,main依赖service的service.h.service依赖base的base.h,怎么写CMakeList.txt避免main直接耦合bas ...

  10. Java使用POI解析Excel表格

    概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能. 常见的Excel格式有xls和xlsx.07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx ...