现在在做一个银行系统,想实现一张卡不能再两个地方同时取款的功能。想过用sychronized,但是那样效率太低,比方说我只是限制我这张卡不能同时消费,又没有限制其他的卡不能与我的卡同时消费,大家谁有这方面经验,,,
跪求
跪求
解决方案 »
- 想用SWING写一个界面,用来显示构造好的幻方,用什么来显示比较好呢?
- java不借助组件上传图片问题,用最简单的流实现
- 请教关于eclipse的问题
- 一个JAVA图像编程程序:绘制房子,请大虾给点注释,本人是初学者,谢谢!
- 使用Calendar类时——疑惑
- 小弟有问题,一是JFrame.pack(),二是g.DrawStrintg()的
- -1>>32还是-1, -1>>>32为什么还是-1?
- 多线程服务器发生java.lang.OutOfMemoryError,请高手指点
- java中怎么取得系统时间?
- 求一个java正则表达式
- 路过的进来看看~~很基础的问题。。。
- 菜鸟提问:java 怎么根据一个网址下载文件
有何证据 你的每秒交易量有多大 银行的服务器多的是
数据库里可以行锁
此外就算代码里用synchronized也不等于影响所有用户,关键是锁什么。要是锁类当然影响所有用户,但锁加在哪个上面完全是可以自由控制的。
public void synchronized payFor(BigDecimal moneyCount){
....业务操作
}现在假设你有两张卡:c1,c2
现在你在某个线程中用c1.payFor(xxxxxx);的时候,在其它线程中c1.payFor(xxxxx);就是被同步的,他是不能执行的,处于阻塞状态。但是你的c2.payFor();是不受影响的,明白?? public void synchronized payFor(BigDecimal moneyCount){
....业务操作
}
等同于
public void payFor(BigDecimal moneyCount){
synchronized (this){ ....业务操作
}
} 只同步当前对象,明白?那如何保证卡是同一对象? 那就你重写equals () hashCode()
synchronized只同步当前对象是什么意思??
//取钱
}
首先,你的卡这个类public class Card{
private String cardNo;//卡号
private double balance;//余额,其它属性就不写了
public void synchronized payment(double payMoney){
//此处完成你的消费逻辑
}
//重写equals()和hashCode()方法, 根据卡号,也就是cardNo来判断唯一性
} public class TestCard{
public static void main(String[] args){
Card c1 = new Card();
Card c2 = new Card();
//这样就可以了,现在c1,c2调用payment()方法时都是同步的,怎么理解列?
// 就是说如果有一个线程在调用c1.payment()方法的时候,其它线程是不能调用c1.payment(),因为
//此时已经被同步,但是可以调用c2.payment(); 因为payment()方法的synchronized同步的是在方法
//范围内方法当前的调用对象。明白??
}
}
public void synchronized payment(double payMoney){
//此处完成你的消费逻辑
} //等同于
public void payment(double payMoney){
synchronized (this){ //此处完成你的消费逻辑
}
}
如果你对这句话还不能理解,那我真的无能为力了。
synchronized(o) { //o为对象实例
//判断余额
//减少余额
}
public synchronized method()这样的写法其实等价于synchronized(this)根据你的需求
1)对于不同的卡,这个对象实例必须是不同的,否则就会影响别的卡的使用。
2) 对于相同的卡,这个对象实例必须是相同的,否则就起不到互斥的作用。你首先检查自己的设计架构,是否已经存在符合这样特征的对象,若有,它就是个很好的加锁对象。若无,你可以创造出符合这样特征的对象,比如用HashMap建一个锁池。理解了这些,你就应该能明白,21楼所介绍的方法,其前提是payFor()方法所属的对象必须符合上述2个要求
恩。这个考虑是有这个问题。 就算重写了equals方法,能不能保证拿个相同卡号的Bean,在调用同一个方法是同步的列? 虽然他们的内存地址是同一块....这个需要测试
我来做的话确实会这样考虑,但是实际代码还是需要不断run debug review run
while(!noException){
run
debug
review
}
大大们看到不要鄙视。
这个明显解决不了楼主问题吧 ? 在C1 C2 两个对象上分别同步 ,只是对象上所有标记synchronized的方法同步,c1c2 并没什么关系吧 ?