记录一下错误,吸取经验🤔😋
出问题的代码
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;@Overridepublic 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();}
结果:
😏