【Java】多线程同步-之控制static变量同步实例 (多线程卖票)

(多线程卖票)

public class Main {

    public static void main(String[] args) {
        new Thread(new A("线程_1")).start();
        new Thread(new A("线程_2")).start();
        new Thread(new A("线程_3")).start();
        new Thread(new A("线程_4")).start();
        new Thread(new A("线程_5")).start();
    }
}

class A implements Runnable {

    private String name; //线程名
    private static int X = 300; //静态变量
    private static final Object obj = new Object(); //唯一锁

    A(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        while(X > 0) {
            synchronized(obj) { //同步代码块
                System.out.println(this.name +"___"+ --X); //减减后输出
            }
        }
    }

}

卖票卖出负数

当我们修改类A的run()方法

    @Override
    public void run() {
        while(X > 0) {
            synchronized(obj) { //同步代码块
                if (X > 0) { //双重判断
                    System.out.println(this.name +"___"+ --X); //减减后输出
                }
            }
        }
    }

原因要追随代码执行过程

未同步:

同步后:

synchronized关键字可以保证每次只有一条线程进入,但是并不能保证数据是同步的。

使用 双重检查锁 可解决此问题

发布了13 篇原创文章 · 获赞 15 · 访问量 938

猜你喜欢

转载自blog.csdn.net/qq_42470947/article/details/103757863
今日推荐