线程的互斥

Java使用关键字synchronized来执行线程的互斥处理。

synchronized方法

如果声明一个方法时,在前面加上关键字synchronized,那么这个方法就只能由一个线程运行。这种方法称为synchronized方法,有时也成为同步方法。

Bank.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Bank {
private int money;
private String name;

public Bank(String name, int money) {
this.name = name;
this.money = money;
}

public synchronized void deposit(int m) {
money += m;
}

public synchronized boolean withdraw(int m) {
if (money >= m) {
money -= m;
return true;
}
else {
return false;
}
}

public String getName() {
return name;
}
}

synchronized方法每次只能由一个线程运行。

i2UK8e.md.png

线程运行完synchronized方法deposit后,释放锁。

i2U8bt.md.png

获取锁的另一个线程开始运行synchronized方法。

i2Ud2Q.md.png

synchronized实例方法和synchronized代码块

1
2
3
4
5
6
7
8
9
10
11
//synchronized实例方法
synchronized void method() {
...
}

//synchronized代码块
void method() {
synchronized(this) {
...
}
}

synchronized实例方法是使用this的锁来执行线程的互斥处理的。

synchronized静态方法和synchronized代码块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//synchronized静态方法
class Something {
static synchronized void method() {
...
}
}

//synchronized代码块
class Something {
static void method() {
synchronized(Something.class) {
...
}
}
}

synchronized静态方法是使用该类的类对象的锁来执行线程的互斥处理的。