在进行多线程的开发中经常会遇到线程安全问题,那么我们应该如何避免呢.
使用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的方法一定是排队运行的.