线程的互斥处理
互斥:如果一个线程正在执行某一个操作,那么其它的线程就不可以再执行这部分操作。在Java中使用关键字synchronized来执行线程的互斥处理。
synchronized方法:如果声明一个方法时,在前面加上关键字synchronized,那么这个方法就只能由一个线程运行。只能由一个线程运行是每次只能由一个线程运行的意思,并不是说仅能让某一个特定的线程运行。这种方法称为synchronized方法。有时也称为同步方法
下面通过代码的形式来理解互斥。
在这里插入代码片
public static class Bank {
int money;
public Bank(int money) {
this.money = money;
}
synchronized void deposit(int m){//存钱
money += m;
}
synchronized boolean withdraw(int m){//取钱
if (money > m){
System.out.println("取款成功");
money -= m;
return true;
}else {
return false;
}
}
}
如果多个线程同时进行取钱时或者存钱,则先获得锁的那个线程先执行代码块操作,后面的线程等待前面的线程释放锁才能执行。如下图所示:
当锁被释放后,一直等待获取锁的线程中的某一个便会获取该锁。但无论如何获取锁的线程只有一个。如果等待的线程有多个,那么没抢到的线程就只能继续等待。
synchronized实例方法和synchronized代码块
实例方法:
synchronized void method(){
...............
}
代码块:
void method(){
synchronized(this){
...........
}
}
可以看出synchronized实例方法是使用this的锁来执行线程的互斥处理的,两者是等效的。
synchronized静态方法和synchronized代码块