62,614
社区成员
发帖
与我相关
我的任务
分享
请问,如果方法有返回值,该如何用Lock和synchronized进行同步。
示例:
/**
* @author qiao wei
* @brief 从账户中取款。
* @param money 要取出的钱数。money为正数是从账户内取钱,money为负数是向账户内存钱。
* @return 账户剩余的钱数。
* @throws
*/
public double withdraw(double money) {
synchronized (cardId) {
if (this.money >= money) {
System.out.println(Thread.currentThread().getName() + "成功取钱:" + money);
this.money -= money;
System.out.println("账户余额:" + this.money);
} else {
System.out.println("余额不足");
}
return this.money;
}
}
不知道这样使用synchronized,是否使用正确。
/**
* @author qiao wei
* @brief 从账户中取款。
* @param money 要取出的钱数。money为正数是从账户内取钱,money为负数是向账户内存钱。
* @return 账户剩余的钱数。
* @throws
*/
public double withdraw(double money) {
Lock lock;
if (this.money >= money) {
lock = new ReentrantLock();
lock.lock();
if (this.money >= money) {
System.out.println(Thread.currentThread().getName() + "成功取钱:" + money);
this.money -= money;
System.out.println("账户余额:" + this.money);
} else {
System.out.println("余额不足");
}
lock.unlock();
}
return this.money;
}
lock在返回值之前就unlock解锁,多线成功情况下会导致this.money的值改变,该如何使用lock?
更新例子:
public double withdraw(double money) {
Lock lock;
double localMoney = 0;
if (this.money >= money) {
lock = new ReentrantLock();
lock.lock();
if (this.money >= money) {
System.out.println(Thread.currentThread().getName() + "成功取钱:" + money);
this.money -= money;
System.out.println("账户余额:" + this.money);
} else {
System.out.println("余额不足");
}
localMoney = this.money;
lock.unlock();
}
return localMoney;
}
synchronized 例子可以的,lock例子,搞一个局部变量赋值后,在lock范围内赋值后,最后返回局部变量就行。