(多线程卖票)
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关键字可以保证每次只有一条线程进入,但是并不能保证数据是同步的。
使用 双重检查锁 可解决此问题