为什么这种程序不能实现同步呢//Thread类run方法
public void run() {
buy(commodity);
}
public synchronized void buy(int commodity){
Shop.allCommodity = Shop.allCommodity - commodity;
  System.out.println(Thread.currentThread().getName() + "购买了" + commodity
+ "件商品" + "剩余" + Shop.allCommodity);
}
为什么这种程序能实现同步
//Thread类run方法
public void run() {
   synchronized(对象){
buy(commodity);
      }
}public  void buy(int commodity){
Shop.allCommodity = Shop.allCommodity - commodity;
  System.out.println(Thread.currentThread().getName() + "购买了" + commodity
+ "件商品" + "剩余" + Shop.allCommodity);
}

解决方案 »

  1.   

    要看锁住了哪个对象,用synchronized在方法上其实是锁住了拥有这个方法的那个类的对象,用synchronized(对象)则锁住了括号里那个对象,这样其他想要同步访问你锁住的对象时,就加锁并等待
      

  2.   

    synchronized void method{}功能上,等效于void method{
       synchronized(this)
       }
    }
    /*synchronized {修饰代码块}的作用不仅于此,synchronized void method{}整个函数加上synchronized块,效率并不好。在函数内部,可能我们需要同步的只是小部分共享数据,其他数据,
    可以自由访问,这时候我们可以用 synchronized(表达式){//语句}更加精确的控制。*/