记录一下错误,吸取经验🤔😋
出问题的代码
public class Test {
public static void main(String[] args) {
new Thread(new Account()).start(); //!!
new Thread(new Account()).start(); //!!
}
}
class Account implements Runnable {
private static int total = 10000;
@Override
public void run() {
while (true) {
synchronized (this) {
if (total > 0) {
total = total - 1000;
System.out.println("取1000元,当前账户余额:" + total + "元");
try {
Thread.sleep(1000*2);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("账户余额剩余" + total + "元,无法取1000元");
break;
}
}
}
}
}
运行结果:如下图,很显然,2个线程同时进入了同步代码块中,跟没用synchronized一样
问题原因:
synchronized需要作用于同一个对象,而main方法中的代码,显然是创建了2个Account对象,这两个对象可以在同一时刻都拿到锁🔒,这导致了“超取”问题。
修改后的代码
只需要修改main中的代码就行:
public static void main(String[] args) {
// new Thread(new Account()).start();
// new Thread(new Account()).start();
Account account = new Account();
new Thread(account).start();
new Thread(account).start();
}
结果:
😏