看过了phxpaxos的实现,发现选主逻辑中非主也能够调用Propose。
因此即使开启了选主功能,也可能会出现两个人同时Propose的场景。
而Propose时,InstanceID只是作为输出而非输入。因此也无法保证CAS操作的一致性。

目前想到的一种解决方案:
修改Propose的内部实现,开启选主功能后,在确定实例的InstanceID时判断一下自己是不是主。非主时直接返回失败。(选主的Propose除外)

CAS流程:
成为主
lock(状态机)
读状态机
Propose并Execute

unlock(状态机)

而调用Propose和Execute操作不是同一个线程,因此建议的方法是:

Execute时判断SMCtx如果非nullptr(代表是自己Propose的并且有线程在等返回结果),直接return true.

然后调用Propose的线程成功后更新状态机再放锁。

同时还发现选主的逻辑有个可能的问题:有可能2个人同时抢主,两个请求都成功,导致两个人先后成为主。

phxpaxos实现状态机CAS操作的更多相关文章

  1. 【Java并发编程实战】-----“J.U.C”:CAS操作

    CAS,即Compare and Swap,中文翻译为"比较并交换". 对于JUC包中,CAS理论是实现整个java并发包的基石.从整体来看,concurrent包的实现示意图如下 ...

  2. 并发中的Native方法,CAS操作与ABA问题

    Native方法,Unsafe与CAS操作 >>JNI和Native方法 Java中,通过JNI(Java Native Interface,java本地接口)来实现本地化,访问操作系统底 ...

  3. 非阻塞同步机制与CAS操作

    锁的劣势 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程 持有守护变量的锁,都采用独占的方式来访问这些 ...

  4. SpinLock 自旋锁, CAS操作(Compare & Set) ABA Problem

    SpinLock 自旋锁 spinlock 用于CPU同步, 它的实现是基于CPU锁定数据总线的指令. 当某个CPU锁住数据总线后, 它读一个内存单元(spinlock_t)来判断这个spinlock ...

  5. 并发系列2:Java并发的基石,volatile关键字、synchronized关键字、乐观锁CAS操作

    由并发大师Doug Lea操刀的并发包Concurrent是并发编程的重要包,而并发包的基石又是volatile关键字.synchronized关键字.乐观锁CAS操作这些基础.因此了解他们的原理对我 ...

  6. synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化

    进入时:monitorenter 每个对象有一个监视器锁(monitor).当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:1 ...

  7. Go并发编程之美-CAS操作

    摘要: 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我 ...

  8. 具体CAS操作实现(无锁算法)

    具体CAS操作 上一篇讲述了CAS机制,这篇讲解CAS具体操作. 什么是悲观锁.乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优 ...

  9. 基于CAS操作的非阻塞算法

    非阻塞算法(non-blocking algorithms)定义        所谓非阻塞算法是相对于锁机制而言的,是指:一个线程的失败或挂起不应该引起另一个线程的失败或挂起的一种算法.一般是利用硬件 ...

随机推荐

  1. 洛谷 4115 Qtree4——链分治

    题目:https://www.luogu.org/problemnew/show/P4115 论文:https://wenku.baidu.com/view/1bc2e4ea172ded630b1cb ...

  2. C# partial 关健字说明

    参考:http://blog.csdn.net/niemeiquan/article/details/7801803 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个 ...

  3. [ZZ] 边缘检测 梯度与Roberts、Prewitt、Sobel、Lapacian算子

    http://blog.csdn.net/swj110119/article/details/51777422 一.学习心得: 学习图像处理的过程中,刚开始遇到图像梯度和一些算子的概念,这两者到底是什 ...

  4. 交互课件用什么软件------承接教育类k12/幼儿html5交互课件/动画外包

    flash交互课件能生动表达教学内容,也深受广大教育工作者的喜爱,但是目前flash课件只能在pc电脑平台上进行展示,随着移动网络的发展,Adobe宣布2020年停止对flash更新和维护,越来越多的 ...

  5. pecl 更换对应php版本

    转自  https://www.jianshu.com/p/fee58d93e8b1 版本问题 如果我们是通过apt-get或者yum安装的php,现在一般默认的都是php7.0版本. pecl安装过 ...

  6. leetcode 921. 使括号有效的最少添加(Python)

    class Solution: def minAddToMakeValid(self, S): """ :type S: str :rtype: int "&q ...

  7. ES6-map、filter、find、findIndex讲解

    map方法:可以简单的理解为映射 var arr=[1,2,3,4]; console.log( arr.map((n)=>n*n) );//[1, 4, 9, 16] console.log( ...

  8. eclipse修改android项目的apk包名类名

    在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总结: 1.      修改工程名(apk名称) 在弹出的对话框中输入新名称 该操作实际上是修改<project&g ...

  9. GPIO输入输出各种模式(推挽、开漏、准双向端口)详解

    转自:https://blog.csdn.net/techexchangeischeap/article/details/72569999 概述 能将处理器的GPIO(General Purpose ...

  10. WPF DEV gridcontrol 自定义计算列(TotalSummary)

    /// <summary> /// 自定义计算列 /// </summary> /// <param name="sender"></pa ...