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()方法就是一个临界区,它会产生竞态条件。

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

相关文章

  • Spring中的@PostConstruct注解使用详解

    Spring中的@PostConstruct注解使用详解

    这篇文章主要介绍了Spring中的@PostConstruct注解使用详解,该注解被用来修饰一个非静态的void方法,被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次,需要的朋友可以参考下
    2023-10-10
  • maven打包如何指定jdk的版本

    maven打包如何指定jdk的版本

    这篇文章主要介绍了maven打包如何指定jdk的版本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot整合JPA方法及配置解析

    SpringBoot整合JPA方法及配置解析

    这篇文章主要介绍了SpringBoot整合JPA方法及配置过程,JPA是Java Persistence API的简称,中文名Java持久层API,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 利用hadoop查询两两之间有共同好友及他俩的共同好友都是谁

    利用hadoop查询两两之间有共同好友及他俩的共同好友都是谁

    一想到要实现求共同好友的功能,很多人都会想到redis来实现。但是redis存储和数据和计算时需要耗费较多的内存资源。所以文本将介绍另一种方法,即利用Hadoop中的MapReduce来实现,感兴趣的可以了解一下
    2022-01-01
  • Servlet实现分页效果

    Servlet实现分页效果

    这篇文章主要为大家详细介绍了Servlet实现分页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 深入理解java重载和重写

    深入理解java重载和重写

    这篇文章主要介绍了Java方法重载和重写原理区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • @Autowired自动装配,@Bean注入@Primary,@Qualifier优先级讲解

    @Autowired自动装配,@Bean注入@Primary,@Qualifier优先级讲解

    这篇文章主要介绍了@Autowired自动装配,@Bean注入@Primary,@Qualifier优先级,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot浅析缓存机制之Ehcache 2.x应用

    SpringBoot浅析缓存机制之Ehcache 2.x应用

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。它是Hibernate中的默认缓存框架。Ehcache已经发布了3.1版本。但是本文的讲解基于2.x版本
    2022-08-08
  • 踩坑之spring事务,非事务方法与事务方法执行相互调用方式

    踩坑之spring事务,非事务方法与事务方法执行相互调用方式

    这篇文章主要介绍了踩坑之spring事务,非事务方法与事务方法执行相互调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 简单了解Java创建线程两种方法

    简单了解Java创建线程两种方法

    这篇文章主要介绍了简单了解Java创建线程两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论