例:
A转账给B,
C转账给B.
........
入库操作.
1.需要效率,不能把没有冲突的人给锁住,比如:e转账给f,这个时候,ab,ef同时进行,对于A->b做完后才能C->B.
2.暂时想法是把正在进行的人员放入到一个静态的map中(成对放入,比如A,B),
每次先检查要处理的人是否有其中一个正在处理,如果正在处理,那么循环等.如果正在处理的人,处理完了,那么就从map中移除出去,后来的C->B就放入....依次循环..
但如果真的并发了那么放入map的时候可能出现并发,但我不能去锁方法,锁方法就违背了第一个.
其实也不止放的时候,判断map是否存在该人,放入时,删除时,都存在并发的问题.
谁有并发的处理经验?求教.
以这个例子再次说明下:
A->B
C->B
E->F
期望,如果三对同时做的话,那么a,b和e,f先处理,c,b等待.
但愿大家明白我意思.
人员为N,你这个就不是很可取了,有人来注册了,就是多一个人了,像你这么做,别人不操作的你也new出来了,压力太大.其实我觉得从理论上来说,这种既能兼顾效率又能兼顾一致性的并发解决方案并不存在,因为计算机无论任何的逻辑判断过程都是需要时间复杂度的,这是肯定的,只要有时间复杂度,就一定存在并发问题,要解决并发,就必须要加锁,这是没有商量的,但是第一条又要求不能对无影响的用户加锁,如何判断有没有影响呢?当然是通过程序,但是程序又需要时间来执行,执行过程中又会有并发......这是一个悖论楼主可以去看下java.util.concurrent.locks包下的
Lock类和Condition类jdk 1.5新线程同步类。
楼主这个问题,如果把锁挂在每个人头上,就能尽量地避免冲突了。
public interface Transfer {
void action(Transfer transfer);
}
public class TransferImp implements Transfer {
public synchronized action(Transfer transfer) {
synchronized (transfer) {
...
}
}
}
public class TransferThread implements Runnable {
private Transfer from;
private Transfer to;
public TransferThread(Transfer from, Transfer to) {
this.from = from;
this.to = to;
}
public void run() {
from.action(to);
}
}
public class Test {
public void static main(String[] args) {
// 如果是Web环境下你只要将地下申明的a,b,c,e,f对象放入全局就行(如static,application,session等),根据你实际情况
Transfer a = new TransferImp();
Transfer b = new TransferImp();
Transfer c = new TransferImp();
Transfer e = new TransferImp();
Transfer f = new TransferImp();
Thread t1 = new Thread(new TransferThread(a,b));
Thread t2 = new Thread(new TransferThread(c,b));
Thread t3 = new Thread(new TransferThread(e,f));
t1.start();
t2.start();
t3.start();
}
}
只要保证对同一个人的操作都是在同一个对象上,不同人的操作在不同的对象上,就可以实现同步一个人,而不影响其他人了。
可以把Person对象都放在一个全局的PersonMap中,需要操作的时候从PersonMap中获取,保证只有一个人只有实例。如果楼主觉得效率低,也可以搞个优化,定时清理PersonMap中那些不用的Person。
下面代码模拟了一下,至于Map的问题可以另外优化。
public class Translate extends Thread{
private Person p1;
private Person p2;
private int money;该回复于2012-11-12 19:04:45被管理员删除