专栏首页CoffeeLandjava 并发编程基础
原创

java 并发编程基础

Table of Content

  • 计算机基础
  • java的原子性操作
  • java的线程通信
  • java锁机制
  • reference

计算机基础

Bus 总线的概念

总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线地址总线控制总线,分别用来传输数据、数据地址和控制信号。总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。 -- 百度百科

通俗理解: Bus 是公共汽车的意思, 能够让所有组件上车, 在特定的线路上, 将data进行传输, 既然是车,就有速度, 速度是Mhz来表示.

While the wheels on the bus may go "round and round," data on a computer's bus goes up and down. Each bus inside a computer consists of set of wires that allow data to be passed back and forth. Most computers have several buses that transmit data to different parts of the machine. Each bus has a certain size, measured in bits (such as 32-bit or 64-bit), that determines how much data can travel across the bus at one time. Buses also have a certain speed, measured in megahertz, which determines how fast the data can travel.

The computer's primary bus is called the frontside bus and connects the CPU to the rest of the components on the motherboard. Expansion buses, such as PCI and AGP, allow data to move to and from expansion cards, including video cards and other I/O devices. While there are several buses inside a computer, the speed of the frontside bus is the most important, as it determines how fast data can move in and out of the processor.

来自 <https://techterms.com/definition/bus>

Bus通信原理

在计算机中,数据通过总线在处理器和内存之间传递.

每次处理器和内存之间的数据直接的数据传递都是通过一系列步骤来完成, 这一系列的步骤称为总线事务.

总线事务包括读事务和写事务.

读事务将数据从内存传送到处理器

写事务将数据从处理器写入内存中

每个事务会读/写内存中一个或多个物理上连续的字.

总线事务总做机制

当一个处理器执行总线事务期间, 总线会禁止其他的处理器和IO设备执行内存的读/写, 也就是说其他处理器的总线事务会被等待.

总线的这些工作机制可以把所有处理器对内存的访问以串行化的方式来执行. 也就是在任意的时间点, 最多只能有一个处理器可以访问内存, 这个特性确保总线事务之中的内存读写操作具有原子性

java不对long和double类型数据保持原子性,

是因为他们都是8个字节, 64位, 对32位机器可能会把64拆成两个32, 从而进入不同的事务里,因此很难保证原子性操作

java的原子性操作

java的原子性操作是靠循环的CAS来实现的

java的线程通信

java的线程通信是靠 共享内存消息通信 来是实现的

java锁机制

java的轻量级锁

volatile: 使用了锁的happen-before 原则

锁的happen-before原则保证释放锁和获取锁的两个线程之间的内存可见性. 
也就是说, 对一个volatile变量的读,总是能看到任意线程对这个volatile变量的写入

volatile的内存语义

  • volatile写的内存语义

当写一个volatile变量时,JMM会把该线程的对应本地内存的共想变量值刷新到内存里去

  • volatile读的内存语义

当读一个volatile变量时,JMM会把该线程里的本地内存置为无效, 该线程直接从内存里读取该变量里的值

JMM如何实现volatile

编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序.

插入内存屏障的目的就是禁止编译器和处理器的重排序

reference

  • java并发编程的艺术

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • BDD测试框架Cucumber

    最早的有TDD, 测试驱动开发, 而BDD 是行为驱动开发, 更加关注用户的行为,

    CoffeeLand
  • Spring Cloud Stream的理解

    Source: publish the message to a specific channel

    CoffeeLand
  • Fortinet面试总结

    https://stackoverflow.com/questions/29225745/where-is-the-local-final-variable-i...

    CoffeeLand
  • C语言经典习题100例(二)6-10

    给大家推荐一门大数据Spark入门课程https://www.bilibili.com/video/BV1oi4y147iD/,希望大家喜欢。

    cutercorley
  • jvm系列(十一):Java 8-从持久代到metaspace

    译者 梅小西,原文出处:http://blog.csdn.net/wang8118/article/details/45765869 Java 8介绍了一些新语...

    纯洁的微笑
  • 重磅 | 深度揭秘谷歌「量子霸权」计划:有望明年底突破经典计算极限

    关键词:云计算,谷歌,量子计算 网址:www.tikehui.com 近日,New Scientist 发表文章解密谷歌量子计算机的进展。文章中写到,量子计算...

    人称T客
  • Python基础1

    数据类型 Python3中有6钟标准的数据类型:Number(数字)、String(字符 串)、List(列表)、Tuple(元组)、Sets(集合)、Dict...

    企鹅号小编
  • Google推出量子云计算,让科学家远程使用他们的量子计算机

    陈桦 编译自 Bloomberg 量子位 报道 | 公众号 QbitAI ? 过去多年,谷歌投入了大量时间和资金,专注于当代科技行业最远大的理想之一:开发可实际...

    量子位
  • .NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】

       前段时间在反编译代码时无意间看到在类中有一个BeforeFieldInit特性,处于好奇的心态查了查这个特性,发现这是一个关于字段初始化时间的特性【提前初...

    莫问今朝
  • C# 局部函数与事件

    在以前,如果有一个事件public event EventHandler Foo和一个函数private void Program_Foo(object sen...

    林德熙

扫码关注云+社区

领取腾讯云代金券