代码一:
class Bank { private int money = 1000; public synchronized int getMoney(int number) { if (number > money) { return -1; } else if (number < 0) { return -2; } else if (money < 0) { return -3; } else { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } money -= number; } System.out.println("left:" + money); return number; } }
代码二:
class Bank { private int money = 1000; public int getMoney(int number) { synchronized (this) { if (number > money) { return -1; } else if (number < 0) { return -2; } else if (money < 0) { return -3; } else { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } money -= number; } System.out.println("left:" + money); return number; } } }
如果建立几个线程同时分别运行这两段代码的话,你会发现运行的结果是相同的。
其实,synchronized一个method的时候,就相当于对于当前对象的synchronized,即synchronized(this)。可以进一步的理解为,synchronized只能给对象上锁,而对方法上锁的写法其实是对synchronized(this)的简写形式,从代码可以看出,这种简写形式有时候非常方便。
但是对于某些精准操作的话就不能这么简写了。比如:
private Bank bank;
public void doSomething
{
do something before;
synchronized(bank){do something};
do somethingafter;
}
上面这种写法的好处是可以针对某些需要同步的操作进行synchronized,而不需要同步的操作则不需要synchronized,可以节省一些时间,第二点当然是刚刚谈到的精准控制了。