您的位置:首页 > 其它

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的方法一定是排队运行的.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: