首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

原子操作是如何工作的,以及线程如何不能被抢占。是OS保证还是JVM保证?

原子操作是指在执行过程中不会被中断的操作,要么全部执行成功,要么全部不执行。原子操作的实现通常依赖于底层硬件的支持,如处理器提供的原子指令或者锁机制。

在多线程编程中,线程的抢占是指一个线程被另一个线程暂停执行,然后另一个线程开始执行。线程的抢占可以由操作系统或者虚拟机(如JVM)来实现。

对于原子操作的保证,既可以由操作系统来保证,也可以由虚拟机(如JVM)来保证。具体取决于原子操作的范围和实现方式。

在操作系统层面,可以通过禁用中断来保证原子操作的执行。当一个线程执行原子操作时,操作系统会禁用中断,确保该线程不会被其他线程抢占,从而保证原子操作的完整性。

在虚拟机层面,JVM可以通过使用同步机制(如synchronized关键字或者锁)来保证原子操作的执行。当一个线程获取到锁时,其他线程无法获取该锁,从而保证原子操作的完整性。

需要注意的是,线程的抢占和原子操作的保证是两个不同的概念。线程的抢占是指线程之间的竞争和切换,而原子操作的保证是指操作的完整性和一致性。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云服务器(ECS):https://cloud.tencent.com/product/cvm
  • 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送):https://cloud.tencent.com/product/umeng
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 元宇宙(Tencent XR):https://cloud.tencent.com/product/tencentxr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JVM角度解析Java如何保证线程安全

文章已同步至GitHub开源项目: JVM底层原理解析 从JVM角度解析Java如何保证线程安全 线程安全 ​ 当多个线程同时访问一个对象,如果不用考虑这些线程在运行环境下调度和交替执行,也不需要考虑额外同步...Java中线程安全 ​ 在Java语言中,从JVM底层来看的话,线程安全并不是一个非黑即白二元排他选项,按照安全程度来划分,我们可以将Java中各种操作共享数据分为五类:不可变、绝对线程安全、相对线程安全...从执行成本来看,synchronized一个重量级操作。主流Java虚拟机实现中,Java线程映射到操作系统内核线程,如果要唤醒或者阻塞一个线程,需要从用户态切换到内核态。...此种方案需要硬件发展,因为进行检测是否修改和最终写入这两个操作必须保证原子性。如果这里用前边互斥同步来解决,就没有什么意义了,所以需要硬件层面的支持。...在JDK1.5之后,Java类库中才开始使用CAS操作,该操作由 sun.misc.Unsafe类中方法包装提供。虚拟机会对这些方法进行特殊处理,保证编译之后一条平台相关处理器CAS指令。

96131

JVM角度解析Java如何保证线程安全

文章已同步至GitHub开源项目: JVM底层原理解析 从JVM角度解析Java如何保证线程安全 线程安全 ​ 当多个线程同时访问一个对象,如果不用考虑这些线程在运行环境下调度和交替执行,也不需要考虑额外同步...Java中线程安全 ​ 在Java语言中,从JVM底层来看的话,线程安全并不是一个非黑即白二元排他选项,按照安全程度来划分,我们可以将Java中各种操作共享数据分为五类:不可变、绝对线程安全、相对线程安全...从执行成本来看,synchronized一个重量级操作。主流Java虚拟机实现中,Java线程映射到操作系统内核线程,如果要唤醒或者阻塞一个线程,需要从用户态切换到内核态。...此种方案需要硬件发展,因为进行检测是否修改和最终写入这两个操作必须保证原子性。如果这里用前边互斥同步来解决,就没有什么意义了,所以需要硬件层面的支持。...在JDK1.5之后,Java类库中才开始使用CAS操作,该操作由 sun.misc.Unsafe类中方法包装提供。虚拟机会对这些方法进行特殊处理,保证编译之后一条平台相关处理器CAS指令。

56441

工作八年?高级开发?还是码农?竟然答不出,如何保证RabbitMQ高可用?

一个8年工作经验小伙伴,问到这样一个问题,说如何保证RabbitMQ高可用。关于这个问题呢,这位小伙伴倒是有个实操经验,就是不知道如何组织语言。所以,当时面试结果不太理想。...这个cookie就像暗号一样,只要喊出清楚明白666,就知道Tom粉丝。 另外,RabbitMQ集群节点有两种,一种磁盘节点(Disc Node),一种内存节点(RAM Node)。...假如生产者连接C节点,要将消息通过交换机A路由到队列A,最终消息还是会转发到A节点上存储,因为队列A存储在A节点上。...但如果需要保证队列高可用性,这时候,就需要用到镜像集群模式。...4、负载均衡 集群搭建成功后,要保证高可用,还需要一个负载均衡组件(例如HAProxy,LVS,Nignx),由负载组件来做路由。

17820

JVM学习.04. Java内存模型与线程模型

1、前言 该篇内容主要介绍JVM如何实现多线程,多线程间由于共享和竞争数据而导致一系列问题以及解决方案。...但是实际上却是: volatile变量在各个线程工作内存中不存在一致性问题,但Java中运算符并非原子操作,这就导致了volatile变量运算在并发下一样不安全。...由于volatile变量只能保证可见性,如果遇到以下两条规则运算场景中,还是需要通过枷锁来保证原子性: 运算结果并不依赖变量的当前值,或者能够确保只有单一线程修改变量值 变量不需要与其他状态变量共同参与不变约束...,而不能保证变量赋值操作顺序和程序代码真正执行顺序一致。...缺点LWP会消耗一定内核资源,且仅能支持数量较少。 3.1.2、用户线程 用户线程(UT)指的是完全建立在用户空间线程库上,系统内核不能感知到用户线程存在以及实现。

11710

个人珍藏80道多线程并发面试题(1-10答案解析)

synchronized实现原理 synchronized作用于「方法」或者「代码块」,保证修饰代码在同一时间只能一个线程访问。...如果直接调用Threadrun()方法,其方法还是运行在主线程中,没有起到多线程效果。 7. CAS?CAS 有什么缺陷,如何解决?...❞ 很多时候,CAS思想体现,有个自旋次数,就是为了避开这个耗时问题~ 「只能保证一个变量原子操作。」...❝CAS 保证对一个变量执行操作原子性,如果对多个变量操作时,CAS 目前无法直接保证操作原子。...其他进程不能访问已分配给其他进程资源。 占有且等待:当一个进程在等待分配得到其他资源时,其继续占有已分配得到资源。 非抢占不能强行抢占进程中已占有的资源。

38520

Linux上Java线程同步机制

一个多线程java应用,不管使用了什么样同步机制,最终都要用JVM执行同步处理,而JVM本身也是linux上一个进程,那么java应用线程同步机制,可以说是对操作系统层面的同步机制上层封装。...内核上,CPU local locks基于禁止抢占调度和中断原语lock机制。...OS其他同步操作 除了上述lock算法实现线程同步,另外操作还提供lock-free方式实现同步。...,在此过程中,由于目标值线程成功更新,因此其他线程不能成功执行CAS操作。...TAS Test-and-set,使用原子操作,修改内存值并返回对应内存修改前值,当一个线程在执行TAS操作时,其他线程不能同时操作对应内存。

60830

java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)

他会让写线程冲刷写缓存,读线程刷新读缓存,简言之就是操作后立刻会刷新数据,读取前也会刷新数据; 以保证最新值可以及时更新到主存以及线程及时读取到最新值。...int z=20之前,先执行x定义还是先执行y定义,我们并不关心,只要能够百分之百地保证在执行到z=20时候x=0, y=1,同理关于x自增以及y自减操作都必须在z=20以后才能发生。...这个结果就是上面的逻辑处理后结果。 综上所述,volatile可以对可见性以及有序性进行保障。 那么volatile原子如何?...也就是上面三个步骤顺序不能保证唯一 如果先分配对象需要内存,然后将singleton指向分配内存空间,最后调用构造方法初始化的话 假如当singleton指向分配内存空间后,此时另外线程抢占...(由于不是原子操作所以可能中间抢占线程2此时执行到第一个if (singleton == null) 此时不为空,那么不需要等待线程1结束,直接返回singleton了 显然,此时singleton

56330

某Java大佬在地表最强Java企业面试总结

3.8、 什么线程池?如果让你设计一个动态大小线程池,如何设计,应该有哪些方法? 3.9、 什么死锁?JVM线程死锁,你该如何判断是因为什么?..., expire) 误删锁 假如我们生命事件30秒,结果我在30s内没操作完,但是锁释放了 jvm2拿到了锁进行操作 jvm1 操作完成使用del,结果把jvm2 锁删除了 解决方法...,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。...整个get操作只有很少情况会锁定,相对于之前Hashtable,并发不可避免啊! ConcurrentHashmap只能保证自身数据在多线程环境下不被破坏,而并不能保证业务逻辑正确性。...(又是凉凉一道题,) 为什么选用redis 高效性: Redis读取速度110000次/s,写速度81000次/s 原子性: Redis所有操作都是原子,同时Redis还支持对几个操作全并后原子性执行

40430

内功修炼-击败JMM内存模型

对象如何jvm存储,以及结构,如下图:一个类诞生,会在方法区定义类一些信息jvm给这个类创建一个instanceKlass保存在方法区,当创建对象时,对象会在堆中出现,堆中对象结构包括对象头...主体都是在主内存中2:线程不能直接读写主内存变量,只能操作自己工作内存,再同步主内存3:主内存多个线程共享线程之间不共享线程通信需要通过主内存通信总结一下:变量存在主内存,每个线程有自己工作内存...,它通过可见性,以及操作原子保证线程安全,缺点就是变量操作必须原子,volatile还禁止了重排序总结回顾场景:适用于直接修改原子操作,第二个利用volatile happends -...before特性,实现触发器,保证之前变量也可见,刷新之前变量2:volatile无锁不能保证原子性和互斥性,不能替代synchronized,成本低3:只能用于某个属性,不像synchronized...=原子操作 这个就是独立操作,这个很好理解,一个原子操作,和另一个原子操作,每个操作线程执行时候,一定是不被干扰,但是这两个原子操作时候,不能保证,只能通过加锁,来保证这一些列操作不会被其他线程干扰这也能说明

41640

你真的了解 volatile 关键字吗?

volatile 可以保证线程可见性并且提供了一定有序性,但是无法保证原子性。在 JVM 底层 volatile 采用内存屏障来实现。...随着 64 位操作系统越来越普及,在 64 位 HotSpot JVM 实现中,对64 位数据(long 型,double 型)做原子性处理(由于 JVM 规范没有明确规定,不排除别的 JVM 实现还是按照...线程对变量所有操作都必须在工作内存中进行,而不直接对主存进行操作。并且每个线程不能访问其他线程工作内存。...假设数值未更新到主存之前,当其他线程去读取时(而且优先读取工作内存中数据而非主存),此时主存中可能还是原来旧值,就有可能导致运算结果出错。...如果后者,线程 1 在执行完 3 之后,2 之前,线程 2 抢占,这时 instance 已经是非 null(但是并没有进行初始化),所以线程 2 返回 instance 使用就会报空指针异常。

81810

volatile 与线程那些事

而普通共享变量不能保证可见性,因为普通共享变量修改之后,什么时候写入主存不确定,当其他线程去读取时,此时内存中可能还是原来旧值,因此无法保证可见性。...instance = new Singleton()这句,这并非一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。 但是在 JVM 即时编译器中存在指令重排序优化。...也就是说上面的第二步和第三步顺序不能保证,最终执行顺序可能 1-2-3 也可能 1-3-2。...如果后者,则在 3 执行完毕、2 未执行之前,线程抢占了,这时 instance 已经是非 null 了(但却没有初始化),所以线程二会直接返回 instance,然后使用,然后报错。...volatile关键字能保证数据可见性,但不能保证数据原子性。synchronized关键字两者都能保证

20110

一文搞定Java并发编程面试考点

原子操作指一个不受其他操作影响操作任务单元。原子操作在多线程环境下避免数据不一致必须手段。...为了解决这个问题,必须保证增加操作原子,在JDK1.5之前我们可以使用同步技术来做到这一点。...只能保证一个共享变量原子操作: 当对一个共享变量执行操作时,我们可以使用循环CAS方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作原子性,这个时候就可以用锁。...-JvisualVM:Thread Dump 不做说明,打开JvisualVM后,都是界面操作,过程还是很简单。 53、JVM中哪个参数用来控制线程栈堆栈小?...Volatile变量可以确保先行关系,即写操作会发生在后续操作之前, 但它并不能保证原子性。例如用volatile修饰count变量那么 count++ 操作就不是原子

38110

Java并发编程73道面试题及答案——稳了

原子操作指一个不受其他操作影响操作任务单元。原子操作在多线程环境下避免数据不一致必须手段。...为了解决这个问题,必须保证增加操作原子,在JDK1.5之前我们可以使用同步技术来做到这一点。...只能保证一个共享变量原子操作: 当对一个共享变量执行操作时,我们可以使用循环CAS方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作原子性,这个时候就可以用锁。...-JvisualVM:Thread Dump 不做说明,打开JvisualVM后,都是界面操作,过程还是很简单。 53、JVM中哪个参数用来控制线程栈堆栈小?...Volatile变量可以确保先行关系,即写操作会发生在后续操作之前, 但它并不能保证原子性。例如用volatile修饰count变量那么 count++ 操作就不是原子

38020

Java并发编程73道面试题及答案 —— 面试稳了

原子操作指一个不受其他操作影响操作任务单元。原子操作在多线程环境下避免数据不一致必须手段。...为了解决这个问题,必须保证增加操作原子,在JDK1.5之前我们可以使用同步技术来做到这一点。...只能保证一个共享变量原子操作: 当对一个共享变量执行操作时,我们可以使用循环CAS方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作原子性,这个时候就可以用锁。...-JvisualVM:Thread Dump 不做说明,打开JvisualVM后,都是界面操作,过程还是很简单。 53、JVM中哪个参数用来控制线程栈堆栈小?...Volatile变量可以确保先行关系,即写操作会发生在后续操作之前, 但它并不能保证原子性。例如用volatile修饰count变量那么 count++ 操作就不是原子

37820

一文搞定Java并发编程面试考点

原子操作指一个不受其他操作影响操作任务单元。原子操作在多线程环境下避免数据不一致必须手段。...为了解决这个问题,必须保证增加操作原子,在JDK1.5之前我们可以使用同步技术来做到这一点。...只能保证一个共享变量原子操作: 当对一个共享变量执行操作时,我们可以使用循环CAS方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作原子性,这个时候就可以用锁。...-JvisualVM:Thread Dump 不做说明,打开JvisualVM后,都是界面操作,过程还是很简单。 53、JVM中哪个参数用来控制线程栈堆栈小?...Volatile变量可以确保先行关系,即写操作会发生在后续操作之前, 但它并不能保证原子性。例如用volatile修饰count变量那么 count++ 操作就不是原子

34610

AQS扩展与ReentrantLock实现

在AQS中我们已经讲过了它设计核心和扩展方式. 这里我们看下ReentrantLock如何实现....资源释放时会根据state值, 判断是否重入状态; 只有在state为0时, 才会真正释放锁资源, 唤醒其他线程. tryRelease处理流程如下: 通过对stateCAS操作, 可以轻松实现锁抢占和锁释放操作...Synchronized依赖于JVM底层实现; 而ReentrantLock依赖于JDK实现, lock()和unLock()方法需要try/finally语句配合完成. 3....Synchronized和Volatile比较 1. volatile线程同步轻量级实现, 性能比Synchronized好. 2. volatile只能修饰变量,而Synchronized可以修饰方法以及代码块...多线程访问volatile不会发生线程阻塞, 而Synchronized会出现阻塞. 4. volatile可以保证数据可见性, 不保证原子性; 而Synchronized原子性和可见性都可以保证.

22520

并发,又是并发

也可以理解为守护线程 JVM 自动创建线程(但不一定),用户线程程序创建线程;比如 JVM 垃圾回收线程一个守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程...只能保证一个共享变量原子操作:当对一个共享变量执行操作时,我们可以使用循环 CAS 方式来保证原子操作,但是对多个共享变量操作时,循环 CAS 就无法保证操作原子性,这个时候就可以用锁。...如何在两个线程间共享数据? 在两个线程间共享变量即可实现共享。 一般来说,共享变量要求变量本身线程安全,然后在线程内使用时候,如果有对共享变量复合操作,那么也得保证复合操作线程安全性。...Volatile 变量可以确保先行关系,即写操作会发生在后续操作之前, 但它并不能保证原子性。例如用 volatile 修饰 count 变量那么 count++ 操作就不是原子。...我们可以定义线程优先级,但是这并不能保证高优先级线程会在低优先级线程前执行。线程优先级一个 int 变量(从 1-10),1 代表最低优先级,10 代表最高优先级。

1.1K41

2.1 并发编程之java内存模型JMM & synchronize & volatile详解

数据同步八大操作 还是上面的例子, 线程A如何把变量initFlag读取到工作内存? 他在工作内存怎么工作呢?...但 Java内存模型只要求上述操作必须按顺序执行,而没有保证必须连续执行。 下面就之前案例来分析一下, 线程到底如何将initFlag这个变量从主内存拷贝到工作内存?...而我们加上volatile关键字以后, 可以及时看到变量修改 2. 原子性 volatile可以保证可见性, 他能保证原子性么? volatile不能保证原子性....每个线程, 只有一个操作, counter++, 为什么不能保证原子性呢? 其实counter++不是一步完成. 他分为多步完成....如何保证原子性呢? 加上Synchronize关键字 除了JVM自身提供对基本数据类型读写操作原子性外,可以通过 synchronized和Lock实现原子性。

35820

深入理解Java虚拟机(高效并发)

高效并发 JVM 系列最后一篇,本篇主要介绍虚拟机如何实现多线程、多线程如何共享和竞争数据以及共享和竞争数据带来问题及解决方案。 一....Java 内存模型规定了所有的变量都存储在主内存,每条线程都有自己单独工作内存,线程工作内存中保存了线程使用到变量主内存副本拷贝,线程对变量所有操作都必须在工作内存中进行,而不能直接读写主内存...内存间交互操作 关于主内存与工作内存间具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何工作内存同步回主内存之类细节,Java 内存模型定义了以下 8 种操作来完成,虚拟机实现时必须保证下面的每一种操作都是原子...原子性、可见性和有序性 Java 内存模型围绕着在并发过程中如何处理原子性、可见性和有序性 3 个特质来建立。...二、线程安全与锁优化 本文主题高效并发,但高效前提首先要保证并发正确性和安全性,所以这一小节我们先从如何保证线程并发安全说起。 1 Java 线程安全 那么什么线程安全呢?

38720

Java---线程多(工作内存)和内存模型(主内存)分析

每条线程还有自己工作内存,线程工作内存中保存了线程使用到变量主内存副本拷贝。线程对变量所有操作(读取、赋值),都必须在工作内存中进行,而不能直接读写主内存中变量。...原子操作保证原子性问题。   ...无论普通变量还是volatile变量都是如此,普通变量与volatile变量区别是volatile特殊规则保证了新值能立即同步到主内存,以及每使用前立即从内存刷新。...因为我们可以说volatile保证线程操作时变量可见性,而普通变量则不能保证这一点。...所以,就算你将一个变量修饰为volatile,但是对这个变量操作并不是原子,在并发环境下,还是不能避免错误发生!

1.7K11
领券