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

synchronize关键字_第1张图片


你可能感兴趣的:(synchronize关键字)