Android 多线程之可以重复启动与停止的服务
来源:互联网 发布:mac spss破解版 编辑:程序博客网 时间:2024/05/17 08:31
多线程环境下为了避免死锁,一般提倡开放调用,开放调用可以避免死锁,它的代价是失去原子性。但是在有些时候会显得逻辑错误,例如:
例如
class A{ private boolean mIsStarted; void start(){ boolean changed = false; synchronized(this){ if(!mIsStarted){ mIsStarted = true; changed = false; } if(changed){ callBack.onStart(); } } }boolean isStarted(){ sychronized(this){ return mIstarted; }} void stop(){ boolean changed = false; synchronized(this){ if(mStarted){ mStarted = false; changed = true; } } if(changed){ callBack.onStop(); } } }
在单线程环境下这个代码没有任何问题。可是在多线程环境就会出现奇怪的现象。
原则上讲, onStart 一定要走在onStop前面,可事实并非如此:
执行步骤如下:
线程1 start
线程2 stop
线程1 if(!mIsStarted){
mIsStarted = true; changed = false; }
线程2 synchronized(this){
if(mStarted){ mStarted = false; changed = true; } }
线程2 onStop
线程1 onStart
现在onStop 走在了onStart前面。那么问题来了,如何才能保证onStart 一定在onStop前面呢?
那么问题又来了,stop 方法为什么不允许在start之前调用呢?如果一个类不可restart,那么stop是可以在start之前的,否则是不可以在start之前的。
阅读全文
0 0
- Android 多线程之可以重复启动与停止的服务
- 服务的启动与停止
- Android Studio 之 启动和停止服务
- 线程服务的停止与启动
- MySQL 服务的启动与停止
- tomcat服务启动与停止的监听
- svn服务的停止与启动
- 线程服务的停止与启动
- datastage服务的停止与启动
- 批处理设置服务的启动类型与启动/停止服务
- 启动与停止MYSQL服务
- ZooKeeper之启动、停止服务。
- 服务的启动、停止和与活动的通信
- JBOSS服务的启动、停止
- ORACLE常用的服务启动与停止命令
- C#控制 “MS-SQLServer”服务 的启动与停止
- C#控制 计算机中“服务”的启动与停止
- Sybase-Iq数据的启动与停止服务
- git 备忘录
- Auto-Dependency Generation 2
- iperf测试网络性能
- N
- 最大的问题是没有发现问题之一:谈谈滥用继承
- Android 多线程之可以重复启动与停止的服务
- vue.js笔记
- 将博客搬至CSDN
- HDU 4927 Series 1(大数+杨辉三角)
- 基于高德地图的地理编码
- 创建并运行maven项目
- [置顶] Android之基础建设之IWindow和IWindowSession
- [置顶] Android输入输出系统之TouchEvent流程
- 你所看到较轻松的Dagger2(基础介绍)