Single Thread Execution 模式

概念

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();
    }
}

猜你喜欢

转载自blog.csdn.net/weijifeng_/article/details/80617964
今日推荐