java并发之初识

一:并发编程的难点

1:原子性问题

  • 操作系统做任务切换,可以发生在任何一条CPU指令执行完成后;
  • CPU能保证的原子操作是指令级别的,而不是高级语言的操作符;
    n++不是原子操作的,而是3条指令
    在这里插入图片描述

2:可见性问题

  • 可见性是指一个线程对一个变量进行修改,另外一个线程可以看的到
  • 可见性问题是由CPU的缓存导致的,多核CPU均有各自的缓存,这些缓存要与内存进行同步。(其实就是多线程环境下,一个线程对一个变量的改变了,而另一个线程没看到,那么的话还是按照原来的变量的值进行计算的话,那么就会出错)。

3:有序性问题

  • 在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序;
  • 重排序不会影响单线程的执行结果,但是在并发情况下,可能会出现诡异的BUG。
    在这里插入图片描述

二:并发编程

1:并发编程的目标

解决多核多线程下,造成的 缓存不一致问题,指令重排问题,处理器优化问题

  • 在cpu和主存之间添加缓存,在多线程下会存在缓存一致性问题(可见性问题)
  • 处理器内部为了使运算单元尽可能的被充分利用,处理器可能会对输入的代码进行乱序处理。这就是处理器优化。(原子性问题)
  • 很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。(指令重排问题)

2:并发编程的内存模型

  • 为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。
  • 通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。

3:这个内存模型是什么

  • JMM是Java Memory Model的缩写,Java线程之间的通信由JMM控制,即JMM决定一个线程对共享变量的写入何时对另一个线程可见。
  • JMM定义了线程和主内存之间的抽象关系,通过控制主内存与每个本地内存(抽象概念)之间的交互,JMM为Java程序员提供了内存可见性的保证。
  • JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。

4:源代码和指令间的重排序

为了提高性能,编译器和处理器常常会对指令做重排序。重排序有3种类型,其中后2种都是处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。

  • 1.编译器优化重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
  • 2.指令级并行重排序:现代处理器采用了指令级并行技术来将多条指令重叠执行,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
  • 3.内存系统的重排序:由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
    在这里插入图片描述

5:解决CPU带来的重排序

  • CPU内存屏障:
    • 1.LoadLoad:禁止读和读的重排序;
    • 2.StoreStore:禁止写和写的重排序,
    • 3.LoadStore:禁止读和写的重排序,
    • 4.StoreLoad:禁止写和读的重排序。
  • Java内存屏障:
public final class Unsafef{
public native void loadFence();//LoadLoad LoadStore
public native void storeFence();//StoreStore LoadStore
public native void fullFence();//loadFence()+storeFence()+StoreLoad
}

6:解决编译器带来的重排序

(1):如何解决

JMM使用nappens-before规则来阐述操作之间的内存可见性,以及什么时候不能重排序。在JMM中如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在nappens-.before:关系。换个角度来说,如果A happens-before B,则意味着A的执行结果必须对B可见,也就是保证跨线程的内存可见性。其中,前4条规则与程序员密切相关。

  • 1.程序顺序规则:一个线程中的每个操作,happens-before于(对…可见)该线程中的任意后续操作,
  • 2.volatile?变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读,
  • 3.synchronized规则:对一个锁的解锁,happens-before于随后对这个锁的加锁,
  • 4.传递性:若A happens-.before B,且B happens-before C,则A happens-before C,
  • 5.start()规则:若线程A执行Thread.start(0,则线程A的start()操作nappens-before于线程B中的任意操作,
  • 6.join规则:若线程A执行ThreadB.join0并成功返回,那么线程B中的任意操作happens-.before于线程A从ThreadB.join0的成功返回。

(2):关键字vlatile

  • 4.1 volatile的基本特性
    • 可见性:对一个volatile变量的读,总是能看到对这个volatile变量最后的写入:
    • 原子性:对任意单个volatile变量的读/写具有原子性,但类似volatile++这种复合操作不具有原子性。
  • 4.2 volatilet的内存语义
    • 写内存语义:当写一个volatile变量时,JMM会把该线程本地内存中的共享变量的值刷新到主内存
    • 读内存语义:当读一个volatile变量时,JMM会把该线程本地内存置为无效,使其从主内存中读取共享变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java并发之synchronized实现原理及其优化

1:synchronnized概述 synchronized修饰的方法或代码块相当于并发中的临界区,即在同一时刻jvm只允许一个线程进入执行。synchronized是通过锁机制实现同一时刻只允许一个线程来访问共享资源的。另外synchronized锁机制还可以保证线程并发运行的原子性,有…

.NET 是信息技术应用创新产业重要参与者

今天是国庆节,也是中秋节,月满中秋,举国欢庆,在这里祝各位开发者中秋国庆快乐。放假在家就想把这几年对于.NET发展相关生态做个梳理,写一篇文章来总结一下这两年从腾讯出来自己创业,推动.NET在国内的应用的…

蓝桥杯- 包子凑数

一:题目 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼,其中第 ii 种蒸笼恰好能放 A_iA i ​ 个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买 XX 个包子,卖包子的大叔就会迅速选出若…

秋天 | 等疫情过后,我们继续背起相机去旅行

这是头哥侃码的第218篇原创2020年,注定是不平凡的一年。八个月前,我正和家人一起沉浸在春节的喜悦中,可没成想一场疫情的到来彻底改变了欢快的气氛。别的倒没什么,只是之前所有的计划全部被打乱了。先说春节假期,和舅舅…

简单理解CAP-BASE

1、CAPCAP是分布式系统的指导理论,是NoSQL数据库的理论基石。CAP其实就是对分布式系统的特性总结,即一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。…

面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?

文章目录[TOC](文章目录)1:解析URL网址,从而生成发送给Web服务器的Http请求信息2:真实地址查询-----(DNS域名解析)3:调用协议栈4:可靠的传输 TCP5:远程定位--IP地址6:两点传输--获取MAC地址7:网卡--出口8:送别者--交换机9:出境大门--路由器10:相互扒皮--服务端与客户端1:解析UR…

C# 中的 is 真的是越来越强大,越来越语义化

一:背景 1. 讲故事最近发现 C#7 之后的 is 是越来越看不懂了,乍一看花里胡哨的,不过当我静下心来仔细研读,发现这 is 是越来越短小精悍,而且还特别语义化,那怎是一个爽字了得????,这一篇就和…

leetcode209. 长度最小的子数组(滑动窗口)

一:题目 二:上码 class Solution { public:/**思路:1.滑动窗口解法1>:确定窗口内是什么2>:确定窗口的起始位置3>:确定窗口的终止位置2.窗口:也就是我们的求的连续字符串的和3.窗口的起始位置: 窗口的起始位置最先是我们数组的起始位置,当窗口内连续数组的和大于targe…

开源特训营 - Lesson 4 - 如何运营社区

编辑:李明康责编:袁睿斌作者:课程助教 - 苏斌主讲教师:庄表伟(开源社理事长)、赵生宇(同济大学)本次课程的主题为《如何运营社区》,主讲者为开源社的理事长庄表伟老师和来…

leetcode904. 水果成篮(滑动窗口)

一:题目 二:上码 class Solution { public:/**思路:滑动窗口1.滑动窗口为我们 两个品种水果的个数2.滑动窗口的起始位置为数组的起始位置,当遇见一个新的水果种类的时候,这时候就需要移动我们的起始位置这里移动起始位置是要注意的,我们需要移动起始到我们的窗口中 完全没有 这…

拥抱.NET 5,从自研微服务框架开始

“ 2016年发布了.NET Core第一个正式版本,而.NET5也将在下个月就正式来临了,技术日新月异,也有点让人应接不暇。在框架设计上,.NET Framework的全家桶理念,培养了一大批的CRUD,而.NET Core转变成了按需使用…

leetcode周赛第一题6037. 按奇偶性交换后的最大数字(冒泡法)

一:题目 二:上码 class Solution { public:int largestInteger(int num) {string str to_string(num);for (int i 0; i < str.size()-1; i) {for (int j i1; j < str.size(); j) {int num1 str[j]-0;int num2 str[i]-0;if (num1%2 num2%2) {//这里我们控制的是奇数…

从零开始打造专属钉钉机器人

一、前言废话不多的实现简单的钉钉机器人。我们分为下面几个步骤来逐步讲解。1.钉钉机器人的类型2.如何打造一个最最简单的钉钉机器人二、钉钉机器人的类型常用的钉钉机器人有两种&#xff0c;1、通知类型的机器人&#xff1a;适合在群内进行一些通知&#xff0c;推荐消息等内容…

Azure 内容审查器之文本审查

内容审查器Azure 内容审查器也是一项认知服务。它支持对文本、图形、视频进行内容审核。可以过滤出某些不健康的内容&#xff0c;关键词。使你的网站内容符合当地的法律法规&#xff0c;提供更好的用户体验。文本内容审核其中文本内容的审核应用比较广泛。比如在审核游戏中的群…

java并发之CAS

文章目录1:何为CAS2:CAS图示3:CAS和Volatile的关系4:为何CAS效率更高一些5:CAS的特点7:受保护得共享数据类型(1):原子基本数据类型(2):原子引用数据类型7:ABA问题(1):什么是ABA(2):如何解决呢&#xff1f;1:何为CAS CAS(Compare And Swap)&#xff0c;即比较并交换。是解决多线…

快速了解 ASP.NET Core Blazor

最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历。面试官&#xff1a;“你刚说你喜欢研究新技术&#xff0c;那你有了解过 Blazor 吗&#xff1f;”作为一位专注于 .NET 开发的软件工程师&#xff0c;你好意思说你对 Blazor 一点也不解吗&#xf…

ASP.NET Core集成Nacos配置中心之适配多格式配置

前言 默认情况下&#xff0c;用nacos-sdk-csharp集成ASP.NET Core的配置系统&#xff0c;是基于JSON格式的数据。随着业务系统的多样化&#xff0c;可能用的配置格式也是各有千秋的。有的会用yaml/yml&#xff0c;有的会用ini&#xff0c;有的会用xml&#xff0c;等等。那么如果…

Git的使用(快速入门)

文章目录[TOC]一:将本地的项目提交到Git上二:GIt的基本操作1:建立一个本地仓库(1):类别(2):创建全新的仓库(3):克隆远程仓库2:查看文件的状态3:在桌面上的文件提交到远程仓库4:在idea中的文件提交到远程仓库5:分支(1):何为分支(2):常用命令(3)注意6:解决合并冲突(1):问题展示(2…

为什么这么忙,还依然做不好事情?

一直都很喜欢《重来》系列&#xff0c;最近出了《重来3&#xff1a;跳出疯狂的忙碌》&#xff0c;第一时间在微信读书中阅读了&#xff0c;让我们印象比较深刻的就是「冷静」和「效率」&#xff0c;本文主要说说效率的问题。书的作者是贾森弗里德&#xff08;Jason Fried&#…

开源特训营 - Lesson 6 - 如何提交一个合格的PR

编辑&#xff1a;李明康责编&#xff1a;袁睿斌作者&#xff1a;课程助教 - 苏斌主讲教师&#xff1a;张齐勋&#xff08;北京大学&#xff09;、赵生宇&#xff08;同济大学&#xff09;本次课程的主题为《如何提交一个合格的PR》&#xff0c;主讲者为来自北京大学的张齐勋老师…