synchronize关键字
2016-03-23 22:12
169 查看
在进行多线程的开发中经常会遇到线程安全问题,那么我们应该如何避免呢.
使用synchronize关键字就可以很好的实现线程安全的程序.
在什么情况下会遇到非线程安全问题呢?比如:
线程A 线程B
1.线程A在数据库中查询存票,发现票C可以卖出
2.线程A接受用户订票请求,准备出票.
3. 这时切换到了线程B执行
4. 线程B在数据库中查询存票,发现票C可以卖出
5. 线程B将票卖了出去
6.切换到线程A执行,线程A卖了一张已经卖出的票
这时就会出现非线程安全问题,原因是两个线程同时访问了一个共同的对象并修改了他.所以我们应该在某个线程正在执行一个不可分割的部分时,其它线程不能同时执行这一部分.
synchronize到底锁住了什么?
对于同步块,synchornized获取的是参数中的对象的锁:
synchornized(obj){
//...............
}
线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到,线程只能等待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句,所以,obj对象的作用范围不同,控制程序不同.
对于对象和方法,调用synchronize的方法一定是排队运行的.
使用synchronize关键字就可以很好的实现线程安全的程序.
在什么情况下会遇到非线程安全问题呢?比如:
线程A 线程B
1.线程A在数据库中查询存票,发现票C可以卖出
2.线程A接受用户订票请求,准备出票.
3. 这时切换到了线程B执行
4. 线程B在数据库中查询存票,发现票C可以卖出
5. 线程B将票卖了出去
6.切换到线程A执行,线程A卖了一张已经卖出的票
这时就会出现非线程安全问题,原因是两个线程同时访问了一个共同的对象并修改了他.所以我们应该在某个线程正在执行一个不可分割的部分时,其它线程不能同时执行这一部分.
synchronize到底锁住了什么?
对于同步块,synchornized获取的是参数中的对象的锁:
synchornized(obj){
//...............
}
线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到,线程只能等待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句,所以,obj对象的作用范围不同,控制程序不同.
对于对象和方法,调用synchronize的方法一定是排队运行的.
相关文章推荐
- POJ1860(Currency Exchange)
- 学生成绩
- CF_3C_Tic-tac-toe
- iOS 侧滑按钮的实现
- 今天连续几次被其他电脑客户端踢下线,也不知是否是ip冲突
- Centos 6.5升级到Git2.1.2的步骤
- 网络管理与配置
- 【NYOJ】[168]房间安排
- poj1458 Common Subsequence(最长公共子序列)
- 400错误
- 设计模式课后习题(工厂模式)
- CC2541 AirSync(5)——登录包
- 浅析在类模版中构建成员函数时,使用memcpy产生的副作用
- 112. Path Sum My Submissions Question
- linux mount (挂载命令)详解
- 数据库基本语句大全
- 代码复审
- TCP长链接/短链接
- 在屏幕上输出你想说的话
- 使用grub的memmap的预留内存时系统死机问题的一个解决方案