前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题。线程安全问题指的是在多线程中,各线程之间因为同时操作所产生的数据污染或其他非预期的程序运行结果。

线程安全

1)非线程安全事例

比如 A 和 B 同时给 C 转账的问题,假设 C 原本余额有 100 元,A 给 C 转账 100 元,正在转的途中,此时 B 也给 C 转了 100 元,这个时候 A 先给 C 转账成功,余额变成了 200 元,但 B 事先查询 C 的余额是 100 元,转账成功之后也是 200 元。当 A 和 B 都给 C 转账完成之后,余额还是 200 元,而非预期的 300 元,这就是典型的线程安全的问题。

2)非线程安全代码示例

上面的内容没看明白没关系,下面来看非线程安全的具体代码:

class ThreadSafeTest {static int number = 0;public static void main(String[] args) throws InterruptedException {Thread thread1 = new Thread(() -> addNumber());Thread thread2 = new Thread(() -> addNumber());thread1.start();thread2.start();thread1.join();

第 5-5 课:线程安全——synchronized 和 ReentrantLock + 面试题相关推荐

  1. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  2. synchronized和ReentrantLock区别

    1.区别: 1)Lock是一个接口,synchronized是Java中的关键字,synchronized是内置的语言实现: 2)synchronized发生异常时,会自动释放线程占用的锁,故不会发生 ...

  3. java 同步方式 lock_java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  4. Java线程安全Lock、ReentrantLock、ReentrantReadWriteLock

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120750932 本文出自[赵彦军的博客] Java线程安全StampedLock ...

  5. Java—synchronized和ReentrantLock锁详解

    关注微信公众号:CodingTechWork,一起学习进步. 1 synchronized 1.1 synchronized介绍 synchronized机制提供了对每个对象相关的隐式监视器锁,并强制 ...

  6. reentrantlock原理_分享:synchronized和ReentrantLock的实现原理知识点

    前言 通常呢,会在并发情况下,同时操作某一业务从而造成数据重复提交,业务混乱等问题,通常呢,遇到解决类似问题可采用加锁,限流等问题来解决,那么看看这篇关于java中关于锁中synchronized和R ...

  7. synchronized和ReentrantLock的5个区别!

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 在 Java 中,常用的锁有两种:synchronized(内置锁)和 ...

  8. synchronized,ReentrantLock、ReentrantReadWriteLock和StampedLock

    java四种上锁方式原理及适用场景区分 synchronized(monitor).ReentantLock(AQS).AtomicLong(CAS).LongAdder(XADD) 针对代码块需要同 ...

  9. 并发编程 Java 三把锁(Synchronized、ReentrantLock、ReadWriteLock)

    Synchronized synchronized 的 3 种用法: 指定加锁对象(代码块):对给定对象加锁,进入同步代码前要获得给定对象的锁. void resource1() {synchroni ...

最新文章

  1. SVM为什么采用间隔最大化?SVM为什么将原始问题转换为其对偶问题?
  2. 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 三 NSArray
  3. Object.keys 及表单清空
  4. python推荐书-python的书推荐
  5. 基于SPI的数据报过滤原理与实现
  6. beanshell断言_JMeter使用BeanShell断言
  7. 不断尝试,终能到达彼岸
  8. SpringCloud大致架构
  9. Flask前后端分离跨域问题解决方案
  10. WPF老矣,尚能饭否——且说说WPF今生未来(中):策略
  11. Windows服务器配置DFS实现文件同步
  12. coredump详解
  13. Atitit 表达式概论 艾提拉著 目录 1. 表达式分类 2 1.1. 条件表达式 ?:三元符号 2 1.2. 中缀表达式 前缀 后缀表达式 2 1.3. S表达式 2 1.4. 《精通lamb
  14. 人工智能AI伪原创一键生成文章
  15. (1-3)sklearn库的模型----无监督学习
  16. Python3网络爬虫:今日头条新闻App的广告数据抓取
  17. 保护环境倡议书500字
  18. 微信备份到云服务器失败怎么回事,iCloud云备份失败是为什么呢?iCloud云备份启用失败如何解决...
  19. 虚拟服务器的磁盘合并,磁盘管理怎么合并分区
  20. 7种常见的APPUI界面设计布局风格欣赏

热门文章

  1. V$LICENSE表结构
  2. C++通过原子变量代替互斥量
  3. springboot系列(十)springboot整合shiro实现登录认证
  4. android 开发书签大全,一站式的导航分享!
  5. 10.8-全栈Java笔记:序列化/反序列化的步骤和实例
  6. html的学习思维导图
  7. .NET配置文件读写实例(附SosoftConfigHelper类)
  8. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
  9. 账户配置 三: Gmail
  10. javascript变量声明语法的应用和分号讲究适用性