本文为转载学习

在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。

多线程同时执行下面的代码可能会出错:

public class Counter {

protected long count = 0;

public void add(long value){

this.count = this.count + value;

}

}

想象下线程A和B同时执行同一个Counter对象的add()方法,我们无法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条指令来执行的,而是按照下面的顺序:

从内存获取 this.count 的值放到寄存器

将寄存器中的值增加value

将寄存器中的值写回内存

观察线程A和B交错执行会发生什么:

this.count = 0;

A:读取 this.count 到一个寄存器 (0)

B:读取 this.count 到一个寄存器 (0)

B: 将寄存器的值加2

B:回写寄存器值(2)到内存. this.count 现在等于 2

A:将寄存器的值加3

A:回写寄存器值(3)到内存. this.count 现在等于 3

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

竞态条件 & 临界区

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

java 多线程 临界区_【Java并发性和多线程】竞态条件与临界区相关推荐

  1. 并发基础篇(一): Java 并发性和多线程

    说在前面 介绍文章之前,先给出一个多线程的思维导图, 后续的文章就根据思维导图来一步一步的分析java多线程的知识. 一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多 ...

  2. 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...

  3. 【Java并发性和多线程】线程安全及不可变性

    2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/threa ...

  4. 竞态条件的赋值_《Java并发编程实战》读书笔记一:基础知识

    一.线程安全性 一个对象是否是需要是线性安全的,取决于它是否需要被多个线程访问 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步,这个 ...

  5. Java并发性和多线程介绍

    作者:Jakob Jenkov 译者:Simon-SZ  校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...

  6. 21、Java并发性和多线程-Java中的锁

    以下内容转自http://ifeve.com/locks/: 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂.因为锁(以及其它更高级的 ...

  7. 【Java并发性和多线程】Java中的锁

    2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接:http://ifeve.com/locks/ 锁像synchronized同步块一样,是一种线程同 ...

  8. 5、Java并发性和多线程-相同线程

    以下内容转自http://tutorials.jenkov.com/java-concurrency/same-threading.html(使用谷歌翻译): 相同线程(同一线程)是一种并发模型,其中 ...

  9. java利己线程_第10章 多线程2_Java程序设计与应用开发_ppt_大学课件预览_高等教育资讯网...

    第十章 多线程 杨 娟 it@126.com Java 程序设计 教学内容 ? 线程的概念 ? 多线程的实现 ? 线程的生命周期 ? 线程的中断 ? 线程的优先级 ? 同步线程 ? 小结 10.1 线 ...

最新文章

  1. 机器学习各领域必读经典综述
  2. 精心挑选12款优秀的 JavaScript 日历和时间选择插件
  3. Apache 下更改 DocumentRoot 和新建虚拟目录
  4. oracle怎么解析sql,oracle SQL解析步骤小结
  5. assign与weak区别(面试)
  6. Python 爬虫进阶二之 PySpider 框架安装配置
  7. java密码校验_java强密码校验
  8. 论文的事情终于可以告一段落了
  9. schedule_timeout与mdelay的区别
  10. 中值滤波器和双边滤波器(python实现)
  11. vscode更改背景颜色
  12. 妙不可言的JASTVIN云域网,用过的都说好!你怎么看
  13. STM32F107VCTx HAL库 USART通信 DMA通信 友善串口调试助手 PL2303驱动安装
  14. VS中更改exe程序图标
  15. 橡胶接头分类和型号规格选择
  16. 总结:大学实验室的教授喜欢什么样的本科实习学生
  17. Termux搭建图形化环境及tk开发
  18. 第十三届蓝桥杯大赛软件赛决赛(C/C++ 大学B组)
  19. 2.3.2 浮点数的加减运算
  20. 安装多个Vivado版本后,双击.xpr如何启动最新版本

热门文章

  1. [HAOI2007]反素数
  2. web.xml详细配置
  3. NoSQL之Cassandra
  4. Oracle中Number类型字段使用.netTiers和CodeSmith问题的解决方案
  5. “Rule can only have one resource source”错误
  6. 微课|玩转Python轻松过二级(2.4节):常用内置函数用法精要2
  7. 小米无线网卡驱动_小米air笔记本蓝屏故障排除,一个匪夷所思的故障原因。
  8. linux c++ 函数效率,C++高精度性能测试函数
  9. java输入a控制台打印1_Java—— 流(Stream)、文件(File)和IO
  10. 5v继电器模块实物接线_继电器驱动无刷电机正反转(单向电调)