一、原子性**

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.并发编程的三大特性相关推荐

  1. 马士兵-郑金维—并发编程—5.线程池

    什么是线程池 为什么要使用线程池 在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行. 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可以了. ...

  2. java面向对象特性_java面向对象编程三大特性

    一说到java面向对象编程就想到面向对象的三大特性,封装,继承和多态,下面我们来具体分析以下这三大特性在编程中是如何具体体现的. 封装 将类的属性和具体实现细节隐藏,只提供相关的接口和方法来对隐藏信息 ...

  3. Java高并发编程 (马士兵老师视频)笔记(一)同步器

    本篇主要总结同步器的相关例子:包括synchronized.volatile.原子变量类(AtomicXxx).CountDownLatch.ReentrantLock和ThreadLocal.还涉及 ...

  4. 【并发编程】并发编程的三大特性

    并发编程的书籍都会讲到并发编程的三大特性,这是并发编程中所有问题的根源,我们只有深刻理解了这三大特性,才不会编写出漏洞百出的并发程序. 基本概念 1.原子性,所有操作要么全部成功,要么全部失败. 2. ...

  5. 函数式编程——做到并发,不可变数据修改就只能复制后修改返回

    函数式编程 from:https://coolshell.cn/articles/10822.html 当我们说起函数式编程来说,我们会看到如下函数式编程的长相: 函数式编程的三大特性: immuta ...

  6. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  7. C#编程高并发的几种处理方法

    并发(英文Concurrency),其实是一个很泛的概念,字面意思就是"同时做多件事",不过方式有所不同.在.NET的世界里面,处理高并发大致有以下几种方法: 1,异步编程 异步编 ...

  8. java 原子类_小学妹教你并发编程的三大特性:原子性、可见性、有序性

    在并发编程中有三个非常重要的特性:原子性.有序性,.可见性,学妹发现你对它们不是很了解,她很着急,因为理解这三个特性对于能够正确地开发高并发程序有很大的帮助,接下来的面试中也极有可能被问到,小学妹就忍 ...

  9. Java并发编程以及并发须知的几个概念:什么是线程安全?

    众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的.为了追求成为一个好的Java程序员,我决定从今天开始死磕Java的并 ...

最新文章

  1. java对cookie的操作
  2. hrbust 1616 密码锁(广搜)
  3. mysql vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明
  4. 【BZOJ-1458】士兵占领 最大流
  5. get方法请求返回一个文件_一键转换多种文件格式,完全免费,总有一个方法适合你...
  6. python 片段_python片段程序
  7. HOJ 1157 SCUD Busters
  8. html 在线布局,html布局-管理系统布局
  9. CSS3 高斯模糊与动画效果
  10. 毕业五年同是程序员为什么差距这么大?他年薪百万,他月薪一万
  11. 有关centos7 图形化root用户登录
  12. 看看DelayQueue源码
  13. Javaworkers团队第五周项目总结
  14. 将 Hexo 部署到阿里云轻量服务器
  15. MASR语音识别算法简介
  16. 全文搜索功能--solr
  17. ida android so 断点,IDA Pro 7.0+调试Android so飘云整理(基于Android5.1.1)
  18. c++编写断点续传和多线程下载模块【转】
  19. stm32h7能跑linux,STM32H7榨干了Cortex-M7的最后一滴血
  20. 程序员养生书单,九本必读养生书籍,颈椎按摩,脊椎按摩,脱发植发

热门文章

  1. es dsl 提取不重复值_询问操作方法:诊断DSL挂断,从PowerPoint中提取媒体,将IE限制为单个网页...
  2. VScode、argparse库、lauch.json中args参数
  3. 玩转基因组浏览器之IGV进行序列比对
  4. 逆变器控制保护机制ASC和FW
  5. webpack 的externals配置
  6. 怎么让iphone自动阅读_如何使iPhone自动更正的鸭子让你发誓
  7. python 赋值_python编程自学笔记变量赋值数据类型格式化输出
  8. 解决 Maven 本地仓库有jar包,还是要到远程仓库去取的问题
  9. 你要的职场“摸鱼”神器来了!送书5本!
  10. C#设置Label字体动态左右滚动