package com.homework01;
public class MyRun01 implements Runnable{
private int money=10000;
@Override
public void run() {
while(money>0){//这样写虽然线程安全但是数据不安全,一个线程可能刚确认余额大于0,就释放了锁,
// 但是其他线程在进行若干次数据操作后,让数据小于了0,此时本线程又拿到了锁,就会接着上次
// 失去锁的位置接着执行,失去锁时是大于0的,但是此一时彼一时,现在拿到锁已经小于0,但是接着
//上次失去锁的位置执行的话就没有判断这一步骤了,这就造成了数据操作错误
synchronized (this){
if (money<=0){
break;
}
money-=1000;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"取了1000,还剩:"+money);
}
}
}
}
package com.homework01;
public class Test01 {
public static void main(String[] args) {
MyRun01 myRun01 = new MyRun01();
new Thread(myRun01).start();
new Thread(myRun01).start();
}
}
输出结果;
线程Thread-0取了1000,还剩:9000
线程Thread-0取了1000,还剩:8000
线程Thread-1取了1000,还剩:7000
线程Thread-1取了1000,还剩:6000
线程Thread-1取了1000,还剩:5000
线程Thread-0取了1000,还剩:4000
线程Thread-0取了1000,还剩:3000
线程Thread-0取了1000,还剩:2000
线程Thread-0取了1000,还剩:1000
线程Thread-1取了1000,还剩:0