写了一个小程序,我觉应该是同步的,但结果不正确。程序是模拟银行账户的流水
public class Account {
private int money = 60000;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
public class Save implements Runnable{
private Account account;
public Save(Account account) {
this.account=account;
}
@Override
public void run() {
for(int i=0;i<50000;i++){
synchronized (account) { //连续执行一定放入同步快中
account.setMoney(account.getMoney()+1);
// System.out.println("向账户存了1元,账户余额"+account.getMoney()+"元");
}
}
}
}
public class Take implements Runnable{
private Account account;
public Take(Account account) {
this.account=account;
}
@Override
public void run() {
for(int i=0;i<50000;i++){
synchronized (account) {
if(account.getMoney() > 0){
account.setMoney(account.getMoney()-1);
// System.out.println("向账户取了1元,账户余额"+account.getMoney()+"元");
}else{
// System.out.println("账户余额不足");
}
}
}
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account account = new Account();
Save save = new Save(account);
Take take = new Take(account);
Thread thread1 = new Thread(save);
Thread thread2 = new Thread(take);
System.out.println("账户余额为"+account.getMoney());
System.out.println("开始");
thread1.start();
thread2.start();
System.out.println("最后账户余额为:"+account.getMoney());
}
}
存钱和取钱的钱数是一样的,所以总数应该还是60000,但结果不是这个数。是不是我Main线程先运行结束了?所以显示出来的“最后账户余额”不正确。
结合题主的问题再仔细看了遍代码,总结了一下,题主想问的问题应该是我明明synchronized了,为什么没有同步?
其实题主理解错synchronized的用法了,synchronized其实是针对一个变量来说的,如果在某个线程使用到synchronized的变量,就会先判断该变量是否有其他线程在使用,如果使用了就阻塞该线程直到该变量被其他线程用完。
分析题主的代码。这里有3个线程,而主线程没有使用synchronized。因此一方面是它不会等变量被使用完毕再调用,第二方面是,即使使用了synchronized也会在变量空闲的时候被调用,不会等到整个程序运行完了才调用
题主可以参考这些文章
http://m.blog.csdn.net/blog/lianqiangjava/12652201
http://www.2cto.com/kf/201408/324061.html