热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高效并发高级黄金

多线程执行内存模型和特点原子性:指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始不会被其他线程干扰有序性ÿ

多线程执行内存模型和特点

  • 原子性:指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始不会被其他线程干扰
  • 有序性:在并发时,程序的执行可能会出现乱序

 

为什么会出现乱序?

  • 一条指令的执行是可以分为很多步骤的,每个步骤是又CPU不同的部件执行,每条指令都对应如下这五个步骤
  1. 取指 IF
  2. 译码和取寄存器操作数 ID
  3. 执行或者有效地址计算 EX
  4. 存储器访问 MEM
  5. 写回 WB
  •  如A=B+C;这里其实是3个指令
  • 读B,读C,B+C,赋值,那么他的执行顺序在CPU中其实是这样的

  • 图中的X是因为第二排指令还没有到MEM,所以没办法获取到C的值,就没办法计算,所以就先空出来,CUP对对这些指令进行进一步的优化,使得所有X都会被填充,这个过程称之为指令重排,正式因为这个原因,使得在并发时,程序的执行可能会出现乱序。

 

  • 可见性:可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改
  • 编译器优化

 硬件优化(如写吸收,批操作)

 

 

  • Hapepen-Before规则
  1. 程序顺序原则:一个线程内保证语义的串行性,在代码层面上是按照顺序执行的
  2. volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
  3. 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
  4. 传递性:A先于B,B先于C,那么A必然先于C
  5. 线程的start()方法先于它的每一个动作
  6. 线程的所有操作先于线程的终结(Thread.join())
  7. 线程的中断(interrupt())先于被中断线程的代码
  8. 对象的构造函数执行结束先于finalize()方法

 

  • 对于volatile变量的特殊规则
  1. 第一是保证了此变量对所有线程的可见性,这里的可见性是指当一条线程修改了这个变量的值,新值对于其他线程来说是立即知道的,而普通变量不能做到这一点,如果使用volatile变量来控制并发,必须满足运算结果不依赖于变量的当前值,或者能够确保只有单一的现场修改变量的值。变量不需要与其他状态变量共同参与不变约束
  2. 第二是禁止指令重排序优化

 

  了解完特点之后,我们下一段来到好玩的知识,也是比较有意思的阶段

 


转载于:https://www.cnblogs.com/zhuoqingsen/p/8647498.html


推荐阅读
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文介绍了如何在 Spring 3.0.5 中使用 JdbcTemplate 插入数据并获取 MySQL 表中的自增主键。 ... [详细]
  • 探讨异步 Rust 中多线程代码无法实现并行化的原因及解决方案。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
author-avatar
serafina捡到一枚人鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有