java多线程编程(三)

java多线程学习视频 Java多线程是一块重要的内容,李兴华讲解的Java是一个很好的资源 立即下载

java多线程编程(三)

     原子操作的实现原理

1.术语定义

在这里插入图片描述

2.处理器如何实现原子操作

(1)使用总线锁保证原子性

第一个机制是通过总线锁保证原子性。如果多个处理器同时对共享变量进行读改写操作(i++就是经典的读改写操作),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。举个例子,如果i=1,我们进行两次i++操作,我们期望的结果是3,但是有可能结果是2。

原因可能是多个处理器同时从各自的缓存中读取变量i,分别进行加1操作,然后分别写入系统内存中。那么,想要保证读改写共享变量的操作是原子的,就必须保证CPU1读改写共享变量的时候,CPU2不能操作缓存了该共享变量内存地址的缓存。

处理器使用总线锁就是来解决这个问题的。所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。

(2)使用缓存锁保证原子性

但是有两种情况下处理器不会使用缓存锁定。
第一种情况是:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行(cache line)时,则处理器会调用总线锁定。
第二种情况是:有些处理器不支持缓存锁定。对于Intel 486和Pentium处理器,就算锁定的内存区域在处理器的缓存行中也会调用总线锁定。
针对以上两个机制,我们通过Intel处理器提供了很多Lock前缀的指令来实现。例如,位测试和修改指令:BTS、BTR、BTC;交换指令XADD、CMPXCHG,以及其他一些操作数和逻辑指令(如ADD、OR)等,被这些指令操作的内存区域就会加锁,导致其他处理器不能同时访问它。

3.Java如何实现原子操作

(1)使用循环CAS实现原子操作

(2)CAS实现原子操作的三大问题

1)ABA问题,就像一个人绕了远路还是走的原来的路吗?
不是
解决方案:加上版本号
2)循环时间长开销大:
自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。pause指令有两个作用:第一,它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,它可以避免在退出循环的时候因内存顺序冲突(Memory Order Violation)而引起CPU流水线被清空(CPU Pipeline Flush),从而提高CPU的执行效率
3)只能保证一个共享变量的原子操作
当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。还有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如,有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java 1.5开始,JDK提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象里来进行CAS操作。

(3)使用锁机制实现原子操作

锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁,当它退出同步块的时候使用循环CAS释放锁。

跪求关注!

汪文君JAVA多线程编程实战(完整不加密) 汪文君JAVA多线程编程实战(完整不加密),连接挂了留言, 我补 立即下载

相关推荐

Windows Server双机热备实战:用IIS+ARR+NLB搭建高可用Web服务(附避坑指南)

本文详细介绍了在Windows Server环境下,利用IIS、ARR(Application Request Routing)和NLB(Network Load Balancing)构建高可用Web服务的实战方案。通过双机热备架构,实现从网络层到应用层的全面冗余与智能流量分发,并提供了关键的配置步骤、常见避坑指南及性能调优建议,确保企业级Web服务的连续性与可靠性。

weixin_29210759的博客 383

Java架构师,大数据架构师,高并发设计模式,机器学习知识点分享

第一章:java精品课程目录大全 1、亿级流量电商详情页系统的大型高并发与高可用缓存架构实战 1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟 2基于大型电商网站中的商品详情页系统贯穿的授课思路介绍7分钟 3小型电商网站的商品详情页的页面静态化架构以及其缺陷11分钟

u014033218的专栏 7252

《童虎学习笔记》5分钟用Keepalived搭建MySQL高可用实现虚ip自动漂移

1

tonghu_note的博客 5617

java多线程编程 - 实战篇(三)

 来源于:转载自dev2dev网友axman的go deep into java专栏。 [深入了解线程对象与线程,线程与运行环境]   在基础篇中的第一节,我就强调过,要了解多线程编程,首要的两个概念就是线程对象和线程。现在我们来深入理解线程对象,线程,运行环境之间的关系,弄清Runnable与Thread的作用。   在JAVA平台中,序列化机制是一个非常重要的机制,如果不能理解并熟练应用序

lifesounds的专栏 712

3台虚拟机部署Doris详细文档(含校验步骤)

摘要:本文详细介绍了Apache Doris在3台虚拟机上的集群部署方案。采用1主FE+1从FE+1观察者FE+3BE的混合部署模式,确保元数据高可用性。硬件配置建议测试环境4核16GB内存,生产环境8核64GB内存。部署步骤包括系统环境配置(关闭防火墙、内核参数优化)、FE/BE节点配置启动、集群初始化验证等。重点配置了IP白名单(172.30.0.115)和数据目录(/data/doris)。通过MySQL客户端和WebUI可监控集群状态,实现千万级数据的实时分析能力,后续可通过增加BE节点线性扩展。

weixin_41026747的博客 932

STM32CubeMX实战:TIM定时器中断配置避坑指南(附100ms精准定时代码)

本文深入解析STM32CubeMX配置TIM定时器中断的常见误区与避坑技巧,重点阐述时钟源、预分频器与自动重装载值的精准计算方法。通过实战案例,提供一份可直接复用的100ms精准定时中断代码模板,并分享调试验证方法,帮助开发者构建稳定可靠的嵌入式系统心跳。

grafana8visual的博客 500

java多线程编程实战(1)

线程生命周期

航行博客 350

告别卡顿!用LVGL+DMA刷新STM32F407的SPI屏幕,性能提升实战

本文详细介绍了如何通过LVGL+DMA技术优化STM32F407驱动SPI屏幕的性能,实现接近60FPS的流畅刷新。从硬件瓶颈分析到SPI与DMA的精细化配置,再到LVGL的双缓冲机制与局部刷新优化,提供了一套完整的性能提升方案。特别适合嵌入式GUI开发中面临卡顿问题的工程师参考。

weixin_42531588的博客 378

JAVA多线程——(三)多线程编程

JAVA多线程——(三)多线程编程 文章目录JAVA多线程——(三)多线程编程【一】Future【二】CompletableFuture【三】Fock_Join【四】链接 【一】Future 【二】CompletableFuture 【三】Fock_Join 【四】链接 ...

wenge1477的博客 469

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程)

本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者和嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。

weixin_42715608的博客 423

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

Java多线程编程三

线程的同步 多线程编程容易突然出现错误,这是因为系统的线程调度具有一定的随机性,也说明了编程不当。在使用多线程的时候,必须要保证线程安全。 线程安全 当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用。达到此目的的过程叫做同步(synchronization)。 多线程共用一份资源时容易出现错误,看如下例子: class TestThread imp...

android开发笔记 223

【StreamSet】ETL之StreamSet之Pipelines的状态监听之WebHook钉钉篇

介绍下StreamSets的状态监听以及钉钉的webhook的互联,这位博友问的恰是时候,不久前我刚刚对接过钉钉的机器人,这次看到这个问题,对我来说,应该轻车熟路了,那就有了这篇博文,状态监听之钉钉篇。...

m0_54252387的博客 487

Java多线程:并发编程(三)

进程:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)。 线程:一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数

weixin_46204877的博客 2255

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java多线程编程(三)——线程锁

同步代码块解决数据安全问题、同步方法解决数据安全问题、同步方法的格式:、同步方法和同步方法块的区别:、同步静态方法、Lock锁

金鳞踏雨 3326

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java小白入门 —— 多线程与并发编程(三)

Java小白入门 —— 多线程与并发编程 一. 线程三大特性: 1. 原子性:即单个线程中是一个整体,要么全部执行且执行过程中不被外界因素打断,要么全部不执行; 2. 可见性:当多个线程访问同一变量时,一个线程修改了变量的值,其他线程都能立即知道; 3. 有序性:程序执行的顺序按照代码的书写流程顺序进行。 二. Java内存模型(JMM) Java内存模型(JMM)决定一个线程对共享变量写入时,其他线程都可见,根据JMM的设计,系统存在一个主内存,所有线程共享的变量都存储在主内存中,且对所有内存都是

qq_43190579的博客 418

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java进阶学习(三)之多线程编程

Java进阶学习(三)之多线程编程 基础知识 一、进程与线程 进程: 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 Java虚拟机允许应用程序同时执行多个执行线程。每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。 每...

qq_35843514的博客 234

java并发编程(三)《多线程》

1 线程简介 11 什么是线程 12为什么要使用线程 2 线程状态 21 线程6种状态 22 线程状态变迁图 3 线程启动和中止 31 创建 32 启动 33 中断 4 线程间通信 41 volatile和synchronized关键字 42 synchronized 421 原理 422 线程对象监视器 同步队列和同步块之间关系 43 等待通知机制生产者消费者模式 431 代码示例 432 原理

lvmama_tujp的博客 1141

Java多线程编程-Thread API (三)

Java多线程编程-Thread APIThread.yield()方法守护进程Thread.setDaemon()方法Thread.setPriority() 我们都知道在执行多线程的时候,我们调用start方法的时候,线程不会立即执行,因为需要获得CPU的执行权之后才能运行线程。但是我们也可以让执行的线程放弃CPU的执行权。 Thread.yield()方法 yield():给调度程序的提示是当前线程愿意放弃当前使用的处理器。调度程序可以随意忽略此提示 Yield是一种启发式尝试,旨在提高线程之间的相对

HQ DevJ的专栏 157

JAVA多线程编程陷阱总结三

陷阱9:volatile只能强调数据的可见性,并不能保证原子操作和线程安全 volatile只能强调数据的可见性,并不能保证原子操作和线程安全,因此volatile不是万能的。参考指令重排序 volatile最常见于下面两种场景。 a. 循环检测机制 volatile boolean done = false;     while( ! done ){

guomei的专栏 903

Java多线程编程(三)——volatile详解

volatile关键字和synchronized一样都能够保证线程的同步。 Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,...

Fighting_初心的博客 568

JAVA多线程和并发编程(三)- JAVA多线程信息共享

JAVA多线程和并发编程

u010888864的博客 3016

Java多线程编程(三)-Future、FutureTask、CompletableFuture

一、Future模式1.Future简介    Future本身是一种被广泛运用的开发设计模式,在很大程度上简化需要数据流同步的并发应用开发。Future对象本身可以看做是一个显示的引用,他的核心思想是异步调用,类似于ajax的异步请求,无需等待请求的结果,可以继续去处理其他的业务。    例如就像现在在网上买东西,选中东西付款之后,不会立即拿到东西,而是拿到一个买东西的订单号,然后过一段时间之后...

qq_41786692的博客 5089

多线程编程(三):java存储模型

16.1 什么是存储模型?要它何用? 例如:线程A将变量variable赋值为3,那在怎样的情况下,线程B中条件(variable == 3)成立呢?多线程环境下有很多因素可以令其不成立,有可能新值仅储存在寄存器里,还有可能新值仅写入了线程A所在处理器的本地Cache,而没有写入主存。 如果缺少同步,其他线程可能无法立即——甚至永远——看到另一个线程操作产生的结果: 编译器生成的指...

小不妞 304

Java多线程高并发编程代码笔记(三)

文章目录线程安全的单例模式多线程安全单例模式(不使用同步锁)多线程安全单例模式(使用同步方法)多线程安全单例模式(使用双重同步锁)多线程安全单例模式(延迟/懒加载 使用静态内部类)多线程安全单例模式(枚举实现)并发容器多线程卖票问题使用线程不安全的容器List使用线程安全的容器Vector在判断和操作放在同步代码块中使用队列(Queue)来实现List、MapConcurrentHashMap和...

C. 556

java多线程编程要点(三)

       在JDK1.5之前,对高质量Java多线程并发程序设计时,为防止程序崩掉等现象的出现,比如使用wait()、notify()和synchronized等,需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,通常会采用一些较为复杂的安全策略,加重了程序员的开发负担。在JDK1.5出现之后,大牛Doug Lee编写了java.util.concurrent

chuangxin的专栏 3460
上一篇: java多线程编程(二)
下一篇: java多线程编程(四)
Round_Yuan
博客等级 码龄10年 26粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值