连咸鱼都能学会的Java多线程同步实现
来源:互联网 发布:c语言中strtok 编辑:程序博客网 时间:2024/04/30 03:21
哈喽,上期博客我们讲了下多线程的实现,那么这期我们来讲下多线程的同步问题
多线程为什么要同步?
问的好,因为存在这样的情况:
当多个线程同时访问一个对象/变量时,这些线程有对对象/变量进行读/写操作,会导致当前对象或变量值状态出现混乱,从而导致程序异常。我举个例子给你看看:
在银行里,小明的卡里有0块,当其账户同时被两个线程操作,一个存100块,一个取100块,会出现什么结果呢?
1.取钱不成功,卡里余额为100
2.取钱成功,卡里余额为0
到底是结果1 , 还是结果2?
无法确定,所以要采用多线程同步解决这种问题。
接下来,我们先用不同步代码来实现这个例子:
我们先来定义小明的账户,及其存取钱的方法(不同步)
接着,我们写个测试类来测试多线程来同时运行存取钱线程,
很好,我们来运行下看看结果:
很好,一开始的时候状态量都非常清晰明确, 我们再接着看,
我们可以清晰的看到,状态量开始混乱起来了,就同我上文所说一样,状态量的混乱会导致程序出现异常
接着,我们来试下用线程同步来运行下存取钱线程
首先,我们先对Bank.java 的存取钱方法进行改造,用synchronized 来修饰,确保线程同步
测试类SyncThreadTset.java 保持不变, 我们运行它,看看结果如何:
从结果可以看到,状态量混乱的情况已经看不到了,很好
当然,我们也能用synchronized代码块同步关键的代码,毕竟同步是一种高开销的操作,应该尽量减少同步的内容。
我们还可以用重入锁来实现线程同步(通过ReenreantLock类的 lock(), unlock()方法来实现),我们这边就不详细说了。
这期博客就到这里,下回见~
参考文献:
http://blog.csdn.net/ewili/article/details/8808491
http://blog.csdn.net/wenwen091100304/article/details/48318699
- 连咸鱼都能学会的Java多线程同步实现
- 连咸鱼都能学会的Java多线程实现
- 连咸鱼都能学会的Java反射
- 连咸鱼都能学会的Java动态代理
- 连咸鱼都能学会的Java异步处理
- 连咸鱼都能学会的Java多线程中的内存模型
- 连咸鱼都能学会的安装tomcat、修改端口
- 连咸鱼都能学会的Zookeeper注册中心的搭建
- 连咸鱼都能学会的dubbo-admin管理平台搭建
- 连咸鱼都能学会的Dubbo分布式服务框架入门(附工程)
- MySQL数据库的增删改查--连咸鱼都能学会
- 解决“Dynamic Web Module 3.0 requires Java 1.6 or newer.”而不影响tomcat 8.0--连咸鱼都能学会
- MySQL数据库从下载到启动详解--连咸鱼都能学会
- volatile能实现多线程同步吗???NO
- Java实现多线程同步
- java实现多线程同步
- 人人都能学会程序设计9多语境的操作
- Java的多线程-实现线程同步
- 内存管理--栈
- STM32的3种低功耗模式
- NI.Circuit.Design.Suite.Pro.v11.0 1CD(NI电路设计套件 电路图捕捉, SPICE仿真和PCB布局
- 微信JS-SDK 接口
- 实战丨大神手把手教你拿下百度账号!
- 连咸鱼都能学会的Java多线程同步实现
- JBoss EAP应用服务器部署方法和JBoss 开发JMS消息服务小例子
- ROS:参数服务器
- Simulink建模与仿真
- 多平台移动项目开发工具Elements发布v9.2,新增Java语言
- Kotlin 集合
- js下拉框动态加载数据信息
- LeetCode- Three Sum
- strlen和sizeof有什么区别?