`
dbp_cn
  • 浏览: 86444 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

原子性

 
阅读更多

当我们在无状态的对象中增加一个状态时,会出现什么情况?假设我们希望增加一个“命中计数器”来统计所处理的请求数量。一种直观的方法是 在Servlet中增加一个long 类型的域,并且每处理一个请求就 将这个值加1,如下程序:

public class UnsafeCountingFactorizer implements Servlet{
    private long count=0;

    public long getCount(return count;}
   
    public void service(ServletRequest req,ServletResponse resp){
         BigInteger i=extractFromRequest(req);
         BigInteger[] factors=factor(i);
         ++count;
         encodeIntoResponse(resp,factors);
    

    }





}

 不幸的是,UnsafeCountingFactorizer并非线程安全的,尽管它在单线程中能正确运行。这个类很可能会丢失一些 更新操作。虽然递增操作++count 是一个紧凑的语法,使其看上去只是一个操作,但这个操作并非原子的,因而它并不会作为一个不可分割的操作来执行。实际上它包含三个独立的操作:读取count的值,将值加1,然后将计算结果写入count。这是一个 “读取-修改-写入”的操作序列,并且结果状态依赖于之前的状态。

在并发环境中,会发生递增操作丢失的情况,这种由于不恰当的执行时序而出现不正确的结果是一种非常重要的情况,它有一个正式的名字:竞态条件(Race condition)。

当计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件,换句话说,就是正确的结果要取决于运气。最常见的竞态条件类型 就是“先检查后执行(Check-Then-Act)”操作, 

 

分享到:
评论

相关推荐

    如何保证数据库同步中目的端交易提交的原子性

    数据库同步是IT领域中一个关键的操作,特别是在分布式系统或者数据迁移场景下,确保目的端交易的原子性至关重要。原子性是ACID(原子性、一致性、隔离性、持久性)事务特性之一,它保证了数据库操作要么全部完成,...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    并发二:原子性、可见性、有序性.pdf

    "并发二:原子性、可见性、有序性" 本文主要讲解了Java内存模型(JMM)中关于并发编程的三个基本概念:原子性、可见性和有序性。 原子性 原子性是指一个操作不会被线程调度机制打断,一旦开始,就一直运行到结束...

    java 并发操作之原子性与可视性1

    在Java并发编程中,原子性和可见性是两个关键的概念,它们直接影响着多线程环境下的程序行为和数据一致性。理解这两个概念对于编写高效且线程安全的代码至关重要。 首先,让我们详细探讨一下原子性。原子性指的是一...

    Java多线程中提到的原子性和可见性、有序性1

    Java多线程编程中,原子性、可见性和有序性是三个关键的概念,它们确保了多线程环境下的正确性。 1. 原子性(Atomicity) 原子性指的是一个操作不可被中断,要么全部执行,要么完全不执行。在Java中,非原生类型的...

    10 有福同享,有难同当—原子性.pdf

    本章将通过“有福同享,有难同当—原子性”这一主题,深入探讨并发编程中的核心概念——原子性,以及与之相关的线程安全和并发编程的三大特性。 并发编程的三大特性包括原子性、可见性和有序性。这些特性是理解和...

    kotlinx.atomicfu,在kotlin中使用原子操作的惯用方法.zip

    1. **AtomicInt**: 这个类提供了对整型值的原子操作,如`incrementAndGet()`用于原子性地增加1,`decrementAndGet()`用于原子性地减少1,以及`getAndIncrement()`、`getAndDecrement()`等方法,可以在不锁住整个对象...

    15 原子性轻量级实现—深入理解Atomic与CAS.pdf

    在这个领域,"原子性"是并发控制的三大特性之一,另外两个是"可见性"和"有序性"。原子性保证了某个操作不会被其他线程中断,从而避免了竞态条件。在Java中,`Atomic`类提供了一种轻量级的、非阻塞的原子性操作实现,...

    STM32的串口变量的原子操作问题

    当使用中断方式处理串口接收任务而非DMA时,由于对缓冲区大小变量(size)的操作不是原子性的,即在同一时间可能发生多个任务对该变量进行读取和修改,这可能导致以下情况: 1. **中断中的++操作**:在串口接收中断...

    long和double类型操作的非原子性探究(csdn)————程序.pdf

    根据《深入 Java 虚拟机》的描述,Java中的`int`和其他不超过32位的基本类型的操作默认是原子性的,这意味着在单个处理器上,这些类型的读写操作不会被分割。然而,对于`long`和`double`类型,情况有所不同。 在32...

    java 并发中的原子性与可视性实例详解

    java 并发中的原子性与可视性实例详解 Java 并发中的原子性与可视性是两个非常重要的概念,它们都是Java 并发编程中需要注意的关键要素。下面我们将从概念、实例和关系三个方面来详细介绍Java 并发中的原子性与可视...

    多线程:可见性、有序性、原子性.xmind

    多线程:可见性、有序性、原子性.xmind

    undolog保证原子性.png

    undolog保证原子性.png

    Java内存模型原子性原理及实例解析

    Java内存模型原子性原理及实例解析 Java内存模型原子性原理是指在多线程环境下,共享变量的访问需要满足原子性要求,即一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。否则可能会...

    swan:验证原子性违规修复的同步

    同步是最常用的原子性违规修复方法,但通常容易出错。 除了引入死锁之外,程序员还很容易不充分地同步代码。 由于行业中几乎所有的修复检查仍然依赖于昂贵的劳动力,而且并发程序的不确定性是出了名的,因此很难找到...

    MySQL8.0 DDL原子性特性及实现原理

    MySQL 8.0 引入了DDL(Data Definition Language)原子性特性,旨在解决之前版本中DDL操作可能引发的元数据不一致问题。在8.0之前,MySQL的Server层和InnoDB引擎层各自维护一套元数据,这可能导致在异常情况下元数据...

    线程安全、volatile关键字、原子性、并发包、死锁、线程池.md

    线程安全、volatile关键字、原子性、并发包、死锁、线程池学习笔记

    易语言线程安全之原子锁与读写锁

    易语言提供了原子加减、原子比较并交换(CAS)等原子操作,确保了这些操作的线程安全性。 读写锁则是一种更高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程进行写入。这种锁的特性提高了多线程...

Global site tag (gtag.js) - Google Analytics