精华内容
下载资源
问答
  • 并发算法
    2018-10-14 19:51:48

    计算机科学中,并发算法就是可以在并发情况下执行的算法。大多数计算机算法都是顺序算法,并且假设该算法从开始运行到结束,不需要执行其他任何进程。这些算法在并发情况下通常无法正确运行,并且结果不确定,因为实际的计算过程是由外部调度程序决定的。并发通常会为算法增加复杂度,并且需要并发控制,例如使用互斥锁避免竞争条件之类的问题。

    许多并行算法可以并发运行,特别是分布式算法,尽管它们在概念上截然不同。


    翻译源:维基百科

    更多相关内容
  • 尹成JAVA高并发算法

    2021-06-12 04:16:39
    掌握数据结构和算法,可称为算法工程师!这是成为架构师的基础,有Google算法大神亲授。我保证你可以写出时空复杂度都很优的架构。有人专门答疑哟!你想要成为架构工程师吗?立即点击报名按钮吧! 北上广容不下肉身...
  • 包括并发的基础理论知识、不同并发模型的选择与适用环境、编写并发程序的基本步骤,并发算法的正确性证明与性能评价,以及在编写并发程序时遵循的一些指导原则等
  • 大数据-算法-实时事务并发控制算法优化.pdf
  • 介绍基于锁的、乐观的和可推测并发控制协议,并对基于PCC协议代表的2PLPA,基于OCC协议代表的OCCBC和WAIT50及基于SCC协议代表的SCC2S和SCCkS的性能进行了评估。在设定实时数据库模式、工作负荷模式以及...
  • 磁盘阵列,CAP原则,数据的一致性,Paxos算法,Raft算法
  • 慢性病与其相关并发症关系的研究,对患者以及医学研究都有重要意义。电子病历中记录的患者就诊数据为研究目标慢性病与其并发症的关系...真实糖尿病患者电子医疗记录数据集上的实验结果表明提出的算法是实用且有效的。
  • 针对多路径并发传输模型的整体性能在部分通信路径性能突变时会急剧下降的多种原因进行分析,选取对性能影响最大的因素(传输延迟)进行了优化,提出了一种针对多路径并发传输模型的传输延迟感知的路径数据分配算法。...
  • 1、采用面向对象思想抽象仿真设计 CPU、寄存器、时钟中断等硬件部件 2、仿真实现进程 PCB 及其控制操作 3、多道程序的并发环境模拟 4、仿真实现进程低级调
  • 基于动态决策的并发控制算法
  • 内存数据库并发控制算法的实验研究.pdf
  • 协同绘图是计算机支持的协同工作(CSCW)的重要研究...本文在基于复制结构的并发控制策略分析的基础上,提出了并发访问控制策略模型,并给出了一个有效的适合绘图对象并发控制算法,在实际应用中表现出较好的协作性能。
  • 并发进程同步算法的设计方法;传统的设计步骤;信号量描述前趋关系;引入前趋图的设计方法;说明事例;并发进程同步问题实例;2;3 1P对3C问题;4 取水果问题;5 取齐偶数问题;6 理发师问题;5 司售协同问题;6 读者写者问题...
  • 仿真设计进程 PCB、PCB表的数据结构 :1.1仿真进程并发的调度环境,设计...换、进程并发、进程阻塞和进程调度的算法 1.2 掌握进程调度的优先权法、时间片轮转法和多级反馈队列算法的实现 1.3 强化算法设计和数据结构。
  • #资源达人分享计划#
  • 一种无锁并发跳表算法的可线性化证明.pdf
  • 并发策略-CAS算法

    千次阅读 2019-11-30 21:37:03
    对于并发控制而言,我们平时用的锁(synchronized,Lock)是一种悲观的策略。它总是假设每一次临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时访问临界区资源,就宁可牺牲性能让线程进行...

    对于并发控制而言,我们平时用的锁(synchronized,Lock)是一种悲观的策略。它总是假设每一次临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时访问临界区资源,就宁可牺牲性能让线程进行等待,所以锁会阻塞线程执行。

    与之相对的有一种乐观的策略,它会假设对资源的访问是没有冲突的。既然没有冲突也就无需等待了,所有的线程都在不停顿的状态下持续执行。那如果遇到问题了无锁的策略使用一种叫做比较交换(CAS Compare And Swap)来鉴别线程冲突,一旦检测到冲突产生,就重试当前操作直到没有冲突。CAS算法是非阻塞的,它对死锁问题天生免疫,而且它比基于锁的方式拥有更优越的性能。

    CAS算法的过程是这样:它包含三个参数 CAS(V,E,N)。V表示要更新的变量,E表示预期的值,N表示新值。仅当V值等于E值时,才会将V的值设置成N,否则什么都不做。最后CAS返回当前V的值。CAS算法需要你额外给出一个期望值,也就是你认为现在变量应该是什么样子,如果变量不是你想象的那样,那说明已经被别人修改过。你就重新读取,再次尝试修改即可。

    JDK并发包有一个atomic包,里面实现了一些直接使用CAS操作的线程安全的类型。其中最常用的一个类应该就是AtomicInteger。我们以此为例来研究一下没有锁的情况下如何做到线程安全。

    private volatile int value;

    这是AtomicInteger类的核心字段,代表当前实际取值,借助volatile保证线程间数据的可见性。

    获取内部数据的方法:

    public final int get() { 
        return value;
    }

    我们从源码的实现看看incrementAndGet()的内部实现  

    public final int incrementAndGet() {
        for (;;) {
            int current = get();
            int next = current   1;
            if (compareAndSet(current, next))
                return next;
            }
    }

    代码第二行使用了一个死循环,原因是:CAS的操作未必都是成功的,因此对于不成功的情况,我们就需要进行不断的尝试。第三行取得当前值,接着 1得到新值next。这里我们使用CAS必需的两个参数:期望值以及新值。使用compareAndSet()将新值next写入。成功的条件是在写入的时刻当前的值应该要等于刚刚取到的current。如果不是这样则说明AtomicInteger的值在第3行到第5行之间被其他线程修改过了。当前看到的状态是一个过期的状态,因此返回失败,需要进行下一次重试,直到成功为止。

    public final boolean compareAndSet(int expect, int update) { 
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

    整体的过程就是这样子,利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。其它原子操作都是利用类似的特性完成的。大概的逻辑应该是这样:

    if (this == expect) { 
        this = update return true;
    } else { 
        return false;
    } 

    CAS虽然能高效的解决原子问题,但是CAS也会带来1个经典问题即ABA问题:

    因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。

    ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。

    从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类在内部不仅维护了对象值,还维护了一个时间戳(可以是任意的一个整数来表示状态值)。当设置对象值时,对象值和状态值都必须满足期望值才会写入成功。因此即使对象被反复读写,写会原值,只要状态值发生变化,就能防止不恰当的写入。  

    /**  
     * @param expectedReference 期望值  
     * @param newReference 写入新值  
     * @param expectedStamp 期望状态值  
     * @param newStamp 新状态值  
     * @return true if successful  
     */  
    public boolean compareAndSet(V   expectedReference,
                                     V   newReference, 
                    int expectedStamp, 
                    int newStamp) {
            Pair<V> current = pair; 
        return expectedReference == current.reference && 
            expectedStamp == current.stamp &&
             ((newReference == current.reference && 
            newStamp == current.stamp) || 
            casPair(current, Pair.of(newReference, newStamp)));
        }

    > 个人公众号:JAVA日知录 , javadaily.cn

    关注公众号获取更多内容

    展开全文
  • 为了解决移动自组织网络(MANET)中暴露终端导致信道利用率降低的问题,指出暴露终端问题的关键在于局部拓扑,并提出一种基于局部拓扑的并发传输算法。该算法中,暴露终端节点通过局部拓扑判断并发传输是否冲突,并通过...
  • 它是用于解决算法问题和 sql 问题的存储库
  • 基于ICD-10诊断编码的慢性病并发症聚类算法.pdf
  • 设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用和剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且...
  • vivaVideo项目使用并发vivalib框架来处理视频或图像序列并生成算法的视频输出。 vivalib框架使用 C++11 多线程支持来并行处理视频或图像序列。该框架以对用户透明的方式实现多线程,这允许用户只专注于计算机视觉...
  • 大数据-算法-降低分布式数据库并发冲突的数据模型研究.pdf
  • 大数据初学者
  • 为保证集群系统中全局事务的...此外,还改进了一种以事务提交图为中心的并发事务调度算法来保证全局事务的可串行化提交,实验结果表明,该算法有效地提高了全局事务执行的并发度,增加了事务吞吐率和减少了响应时间。
  • 双胞胎传统数据结构和算法并发对象并发,并进行性能比较。 有一些utils类来自Robert Sedgewick的,Kevin Wayne网站是
  • 并发进程同步算法的设计方法 关键 资源信号量初值原语位置 传统的设计步骤 分析进程间的制约关系(找出制约资源) 困难 定义信号量确定信号初值 编程安排pv位置 位置错功能错死锁 信号量描述前趋关系 方法(规则)每条边...
  • 通过分析Krinke切片算法对程序循环体内嵌套一个或多个线程结构会产生切片不精确现象,得出 Krinke算法所基于的程序依赖图对线程间数据的依赖关系定义得过于粗糙,且对并发程序执行行为的合法性约束不够严格的结果....
  • 第7章主要介绍了高并发框架Akka的基本使用方法,并使用Ak:ka框架实现了 个简单的粒子群算法, 模拟超高并发的场景。第8章介绍了使用Eclipse进行多线程调试的方法, 并演示了通过Eclipse进行多线程调试重现ArrayList...
  • 分析了Krinke切片算法对循环体内嵌套有线程...该文提出一种新算法,在并发程序内部表示中,增加跨线程边界循环-承载数据依赖,并引入区域化执行证据约束程序行为。实例研究表明,该算法克服了Krinke算法的不精确现象。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 417,536
精华内容 167,014
关键字:

并发算法