需求:
一个银行账户5000块,两夫妻一个拿着 存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。
class BankeTread extends Thread {
public BankeTread() {
}
public BankeTread(String name) {
super(name);
}
static int money = 5000;
static Object o = new Object();
@Override
public void run() {
while (true) {
synchronized (o) {
if(money>0){
System.out.println(currentThread().getName() + "取走了1000元");
money = money -1000;
System.out.println("剩余" + (money));
}else{
System.out.println(currentThread().getName() + "发现没钱了");
break;
}
}
}
}
}
public class Ex{
public static void main(String[] args) throws InterruptedException {
BankeTread ex1 = new BankeTread("丈夫");
BankeTread ex2 = new BankeTread("妻子");
ex2.start();
ex1.start();
}
}
图片:
丈夫和妻子分别取到了钱
妻子或丈夫一个人取光了所有钱
这就是引发的问题,当一个线程取得CPU执行权后,一直到运行完才会释放锁,另一个线程只能永远等待。。。。。
我们发现,本例只是争夺一个公共资源:money的操作权,会引发这种一个线程从始至终都霸占着资源,若是有两个甚至多个公共资源呢?下一篇文章解释这种现象,它叫死锁现象!