马士兵-郑金维—并发编程—2.并发编程的三大特性
一、原子性**
1.1 什么是并发编程的原子性
JMM(Java Memory Model)。不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。
让Java的并发编程可以做到跨平台。
JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!)。
原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。
并发编程的原子性用代码阐述:
private static int count;public static void increment(){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}count++;
}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 100; i++) {increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 100; i++) {increment();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count);
}
当前程序:多线程操作共享数据时,预期的结果,与最终的结果不符。
原子性:多线程操作临界资源,预期的结果与最终结果一致。
通过对这个程序的分析,可以查看出,++的操作,一共分为了三部,首先是线程从主内存拿到数据保存到CPU的寄存器中,然后在寄存器中进行+1操作,最终将结果写回到主内存当中。
1.2 保证并发编程的原子性
1.2.1 synchronized
因为++操作可以从指令中查看到
可以在方法上追加synchronized关键字或者采用同步代码块的形式来保证原子性
synchronized可以让避免多线程同时操作临街资源,同一时间点,只会有一个线程正在操作临界资源
1.2.2 CAS
到底什么是CAS
compare and swap也就是比较和交换,他是一条CPU的并发原语。
他在替换内存的某个位置的值时,首先查看内存中的值与预期值是否一致,如果一致,执行替换操作。这个操作是一个原子性操作。
Java中基于Unsafe的类提供了对CAS的操作的方法,JVM会帮助我们将方法实现CAS汇编指令。
但是要清楚CAS只是比较和交换,在获取原值的这个操作上,需要你自己实现。
private static AtomicInteger count = new AtomicInteger(0);public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 100; i++) {count.incrementAndGet();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 100; i++) {count.incrementAndGet();}});t1.start();t2.start();
马士兵-郑金维—并发编程—2.并发编程的三大特性相关推荐
- 马士兵-郑金维—并发编程—5.线程池
什么是线程池 为什么要使用线程池 在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行. 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可以了. ...
- java面向对象特性_java面向对象编程三大特性
一说到java面向对象编程就想到面向对象的三大特性,封装,继承和多态,下面我们来具体分析以下这三大特性在编程中是如何具体体现的. 封装 将类的属性和具体实现细节隐藏,只提供相关的接口和方法来对隐藏信息 ...
- Java高并发编程 (马士兵老师视频)笔记(一)同步器
本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...
- 【并发编程】并发编程的三大特性
并发编程的书籍都会讲到并发编程的三大特性,这是并发编程中所有问题的根源,我们只有深刻理解了这三大特性,才不会编写出漏洞百出的并发程序. 基本概念 1.原子性,所有操作要么全部成功,要么全部失败. 2. ...
- 函数式编程——做到并发,不可变数据修改就只能复制后修改返回
函数式编程 from:https://coolshell.cn/articles/10822.html 当我们说起函数式编程来说,我们会看到如下函数式编程的长相: 函数式编程的三大特性: immuta ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- C#编程高并发的几种处理方法
并发(英文Concurrency),其实是一个很泛的概念,字面意思就是"同时做多件事",不过方式有所不同.在.NET的世界里面,处理高并发大致有以下几种方法: 1,异步编程 异步编 ...
- java 原子类_小学妹教你并发编程的三大特性:原子性、可见性、有序性
在并发编程中有三个非常重要的特性:原子性.有序性,.可见性,学妹发现你对它们不是很了解,她很着急,因为理解这三个特性对于能够正确地开发高并发程序有很大的帮助,接下来的面试中也极有可能被问到,小学妹就忍 ...
- Java并发编程以及并发须知的几个概念:什么是线程安全?
众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的.为了追求成为一个好的Java程序员,我决定从今天开始死磕Java的并 ...
最新文章
- java对cookie的操作
- hrbust 1616 密码锁(广搜)
- mysql vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明
- 【BZOJ-1458】士兵占领 最大流
- get方法请求返回一个文件_一键转换多种文件格式,完全免费,总有一个方法适合你...
- python 片段_python片段程序
- HOJ 1157 SCUD Busters
- html 在线布局,html布局-管理系统布局
- CSS3 高斯模糊与动画效果
- 毕业五年同是程序员为什么差距这么大?他年薪百万,他月薪一万
- 有关centos7 图形化root用户登录
- 看看DelayQueue源码
- Javaworkers团队第五周项目总结
- 将 Hexo 部署到阿里云轻量服务器
- MASR语音识别算法简介
- 全文搜索功能--solr
- ida android so 断点,IDA Pro 7.0+调试Android so飘云整理(基于Android5.1.1)
- c++编写断点续传和多线程下载模块【转】
- stm32h7能跑linux,STM32H7榨干了Cortex-M7的最后一滴血
- 程序员养生书单,九本必读养生书籍,颈椎按摩,脊椎按摩,脱发植发
热门文章
- es dsl 提取不重复值_询问操作方法:诊断DSL挂断,从PowerPoint中提取媒体,将IE限制为单个网页...
- VScode、argparse库、lauch.json中args参数
- 玩转基因组浏览器之IGV进行序列比对
- 逆变器控制保护机制ASC和FW
- webpack 的externals配置
- 怎么让iphone自动阅读_如何使iPhone自动更正的鸭子让你发誓
- python 赋值_python编程自学笔记变量赋值数据类型格式化输出
- 解决 Maven 本地仓库有jar包,还是要到远程仓库去取的问题
- 你要的职场“摸鱼”神器来了!送书5本!
- C#设置Label字体动态左右滚动