当前位置: 首页 > news >正文

Slipped Conditions

转自:

Slipped Conditions

下文讲述“Slipped Conditions”的简介说明,如下所示:

Slipped Conditions简介说明

Slipped Conditions:一个线程检查某一特定条件到该线程操作此条件期间,这个条件已经被其它线程改变,导致第一个线程在该条件上执行了错误的操作
例:

public class Lock {
    private boolean isLocked = true;
    public void lock(){
      synchronized(this){
        while(isLocked){
          try{
            this.wait();
          } catch(InterruptedException e){
            
          }
        }
      }
 
      synchronized(this){
        isLocked = true;
      }
    }

    public synchronized void unlock(){
      isLocked = false;
      this.notify();
    }
}

在以上的代码中,lock()方法中拥有两个同步块
代码块1:运行wait操作直到isLocked变为false才退出
代码块2:将isLocked置为true,以此来锁住这个Lock实例避免其它线程通过lock()方法

当在某个时刻isLocked为false
此时有两个线程同时访问lock方法
如果第一个线程先进入第一个同步块,这个时候它会发现isLocked为false
  若此时允许第二个线程执行,它也进入第一个同步块,同样发现isLocked是false
   现在两个线程都检查了这个条件为false,然后它们都会继续进入第二个同步块中并设置isLocked为true
---------------------------------------------------------------------------------------------------------------------------------------
以上场景就是slipped conditions的示例
当两个线程检查同一个条件,然后退出同步块
因此在这两个线程改变条件之前,就允许其它线程来检查这个条件(条件被某个线程检查到该条件被此线程改变期间,这个条件已经被其它线程改变过了)
---------------------------------------------------------------------------------------------------------------------------------------
为避免slipped conditions,条件的检查与设置必须是原子的(在第一个线程检查和设置条件期间,不会有其它线程检查这个条件)

为解决以上的异常,我们只需将isLocked = true这行代码移到第一个同步块中,放在while循环后面即可

例:

 
public class Lock {
    private boolean isLocked = true;
    public void lock(){
      synchronized(this){
        while(isLocked){
          try{
            this.wait();
          } catch(InterruptedException e){
          }
        }
        isLocked = true;
      }
    }

    public synchronized void unlock(){
      isLocked = false;
      this.notify();
    }
}

相关文章:

  • 嵌套管程锁死
  • 图解LeetCode——1475. 商品折扣后的最终价格(难度:简单)
  • Java中的锁详解说明
  • GPIO相关介绍
  • 软件工程、软件生命周期、软件定义阶段、需求的层次/特征、概要设计、详细设计
  • 台式机电源更换笔记
  • 从文件资源管理器中隐藏文件
  • # Maven错误Error executing Maven
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (2020)Java后端开发----(面试题和笔试题)
  • lt;JVM调优gt;为什么内存过大?
  • InputMismatchException异常
  • 定时器及案例
  • 代谢组学研究的十大误区——误区十
  • 微服务项目:尚融宝(8)(后端接口:积分等级CRUD)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android Volley源码解析
  • bearychat的java client
  • C++入门教程(10):for 语句
  • C语言笔记(第一章:C语言编程)
  • Druid 在有赞的实践
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Lucene解析 - 基本概念
  • MySQL用户中的%到底包不包括localhost?
  • Python学习笔记 字符串拼接
  • Redis字符串类型内部编码剖析
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 聊聊directory traversal attack
  • 前端面试之闭包
  • 一道闭包题引发的思考
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 正则与JS中的正则
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Prometheus VS InfluxDB
  • Semaphore
  • 阿里云重庆大学大数据训练营落地分享
  • ​LeetCode解法汇总518. 零钱兑换 II
  • "无招胜有招"nbsp;史上最全的互…
  • # .NET Framework中使用命名管道进行进程间通信
  • #define与typedef区别
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (poj1.2.1)1970(筛选法模拟)
  • (超详细)语音信号处理之特征提取
  • (初研) Sentence-embedding fine-tune notebook
  • (待修改)PyG安装步骤
  • (第61天)多租户架构(CDB/PDB)
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转) Face-Resources