public class tests {
public static void main(String[] args) {
Account account1 = new Account();
Account account2 = new Account();
account1.start();
account2.start();
}
}
class Account extends Thread { // 账户
private static Integer money = 11000;
private boolean loop = true;
@Override
public void run() {
// 模拟购物
// 每隔 1 秒调用一次 sell() 方法
// sell() 方法中抢夺静态对象锁
while (loop) {
sell();
// call();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void sell() {
synchronized (money) {
if (money <= 0) {
System.out.println("余额不足");
loop = false;
return;
}
money -= 1000;
Integer budget = money;
//控制台打印余额
System.out.println(budget == money);
System.out.println(Thread.currentThread().getName() + "取走了 1000 元,现有余额为:" + money);
System.out.println("=========================================");
}
}
public void call() {
synchronized (money) {
System.out.println(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName());
System.out.println("==================");
}
}
}
money不能用Integer类型,因为money的值变了,它也指向了新的对象,已经不是原来的对象了,也就是值的改变带来的是对象的改变
类似的String,Long之类的也不行,除非你不改变它的值,也就是不改变变量指向别的对象,否则锁的对象就变了
不可变对象,不要使用同步锁,如下代码不可靠,应该使用Object ob或者Account.class
Integer aa = 1000;
synchronized(aa){
}
如果aa的值发生变化,如aa=1002,而aa指向新的对象,原来锁定的代码块失去同步的意义了。
有帮助的话采纳一下哦!