Java如何在临界区中避免竞态条件

 更新时间:2020年10月19日 09:10:29   作者:cuisuqiang  
这篇文章主要介绍了Java如何在临界区中避免竞态条件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件。

界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。

有临界区是为了让更多的其它线程能安全够访问资源。

class Counter { 
  protected long count = 0; 
  public void add(long value) { 
    this.count = this.count + value; 
  } 
} 

观察线程A和B交错执行会发生什么,两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。

add()方法就是一个临界区,它会产生竞态条件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MyBatis中的SQL映射文件配置结果映射的操作指南

    MyBatis中的SQL映射文件配置结果映射的操作指南

    MyBatis 是一款优秀的 ORM 框架,它提供了多种配置方式来定义 SQL 语句以及结果映射规则,本文将介绍 MyBatis 中的 SQL 映射文件如何配置结果映射,包括常规类型、集合类型等多种情况,需要的朋友可以参考下
    2023-07-07
  • Java实现图片拼接

    Java实现图片拼接

    这篇文章主要为大家详细介绍了Java实现图片拼接的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java实现在SSM下使用支付宝扫码支付功能

    java实现在SSM下使用支付宝扫码支付功能

    这篇文章主要为大家详细介绍了java实现在SSM下使用支付宝扫码支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java中BigDecimal的equals方法和compareTo方法的区别详析

    Java中BigDecimal的equals方法和compareTo方法的区别详析

    这篇文章主要给大家介绍了关于Java中BigDecimal的equals方法和compareTo方法区别的相关资料,对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度,而compareTo方法则不会比较精确度,只比较数值的大小,需要的朋友可以参考下
    2023-11-11
  • Java中的Valid和Validated的比较内容

    Java中的Valid和Validated的比较内容

    在本篇文章里小编给大家整理的是关于Java中的Valid和Validated的比较内容,对此有兴趣的朋友们可以学习参考下。
    2021-02-02
  • 关于json解析多层嵌套并转为对应类(List)

    关于json解析多层嵌套并转为对应类(List)

    在进行JSON解析时,遇到多层嵌套结构可通过递归或专用库来实现,重要的是将嵌套的JSON对象准确转化为对应的Java类,通常需要依赖如Gson或Jackson等库,将JSONObject转为JavaBean时,关注字段匹配与数据类型转换
    2024-10-10
  • Spring事务事件监控的实现

    Spring事务事件监控的实现

    这篇文章主要介绍了Spring事务事件监控的实现。本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Java匿名内部类导致内存泄露的原因与解决方案详解

    Java匿名内部类导致内存泄露的原因与解决方案详解

    这篇文章主要为大家详细介绍了Java因为匿名内部类导致内存泄露的原因以及其解决方案,文中的示例代码讲解详细,希望对大家有所帮助
    2022-11-11
  • 简单了解Java方法的定义和使用实现详解

    简单了解Java方法的定义和使用实现详解

    这篇文章主要介绍了简单了解Java方法的定义和使用实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java多线程中线程池常见7个参数的详解以及执行流程

    Java多线程中线程池常见7个参数的详解以及执行流程

    本文主要介绍了Java多线程中线程池常见7个参数的详解以及执行流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论