概念
Single Thread Execution 模式:就是在多线程执行时,对于共享资源的操作,当一个线程获取到共享资源的锁,并且没有释放锁的时候。其他线程无法使用共享资源。
如果违背了这些原则,则会陷入死锁:
- 具有多个锁参与其中
- 线程锁定一个锁没解除就去获得其他锁
- 线程获取这些锁的顺序不同
但是只要打破其中一个就会避免死锁
共享资源Gate类
使用synchronized锁,对容易发生错误的方法进行加锁,需要对pass加锁,是因为可能在name操作完成,address操作还没有完成赋值时候,有其它线程操作pass的address操作,这时候就会导致check操作错误。
check不用加锁,因为其实私有方法,只有this可以操作。且获取锁和释放锁都是很耗费性能的操作,所以check可以不加锁。
public class Gate {
private int count = 0;
private String name;
private String address;
public synchronized void pass(String name ,String address){
this.count++;
this.name = name;
this.address = address;
check();
}
private void check(){
if(this.name.charAt(0) != this.address.charAt(0)){
System.out.println("broken:" + toString());
}
}
@Override
public synchronized String toString() {
return "No. " + this.count + ":" + this.name + "," + this.address;
}
共享资源使用对象UserClass
public class UserClass implements Runnable {
private String name;
private String address;
private Gate gate;
public UserClass(String name, String address, Gate gate) {
this.name = name;
this.address = address;
this.gate = gate;
}
@Override
public void run() {
while (true) {
gate.pass(name, address);
}
}
}
测试类
public class CliTest {
public static void main(String[] args) {
Gate gate = new Gate();
new Thread(new UserClass("Black","Blund",gate)).start();
new Thread(new UserClass("Alice","Alask",gate)).start();
new Thread(new UserClass("Chris","Canada",gate)).start();
new Thread(new UserClass("Paul","USA",gate)).start();
}
}