1. 同步方法中的锁
当线程调用同步方法时,它自动获得这个方法所在对象的内在锁,并且方法返回时释放锁,如果发生未捕获的异常,也会释放锁。
当调用静态同步方法时,因为静态方法和类相关联,线程获得和这个类关联的Class对象的内在锁。
使用内在锁后,把deposit方法和withdraw方法修改为同步方法,就可以避免线程干扰。
public synchronized void deposit(int amount) {
balance = balance + amount;
}
public synchronized void withdraw(int amount) {
balance = balance – amount;
}
2. 同步语句
同步语句必须指定提供内在锁的对象,其基本用法如下:
synchronized(提供锁的对象){
临界代码
}
用同步语句修改BankAccount类中的方法如下:
public void deposit(int amount) {
synchronized (this) {
balance = balance + amount;
}
}
public void withdraw(int amount) {
synchronized (this) {
balance = balance – amount;
}
}
3. 同步类
把synchronized关键字放在类的前面,这个类中的所有方法都是同步方法。
4. 可重入同步
线程可以获得他已经拥有的锁,运行线程多次获得同一个锁,就是可以重入(reentrant)同步。这种情况通常是同步代码直接或者间接的调用也包含了同步代码的方法,并且两个代码集都使用同一个锁。如果没有可重入同步,那么,同步代码就必须采取很多额外的预防措施避免线程阻塞自己。java java.util.concurrent 包中的 ReentrantLock 即为可重入锁