日期:2014-05-20  浏览次数:20802 次

多线程并发求教
例: 
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等待. 

但愿大家明白我意思.
------解决方案--------------------
楼主可以去看下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();
}
}

------解决方案--------------------
该回复于2012-11-12 19:04:45被管理员删除
------解决方案--------------------
引用:
Java code12345678910111213141516171819202122232425262728293031323334353637383940414243public interface Transfer {    void action(Transfer transfer);} public class TransferImp implements T……


人员为N,你这个就不是很可取了,有人来注册了,就是多一个人了,像你这么做,别人不操作的你也new出来了,压力太大.
------解决方案--------------------
楼主这个问题,如果把锁挂在每个人头上,就能尽量地避免冲突了。
只要保证对同一个人的操作都是在同一个对象上,不同人的操作在不同的对象上,就可以实现同步一个人,而不影响其他人了。
可以把Person对象都放在一个全局的PersonMap中,需要操作的时候从PersonMap中获取,保证只有一个人只有实例。如果楼主觉得效率低,也可以搞个优化,定时清理PersonMap中那些不用的Person。

下面代码模拟了一下,至于Map的问题可以另外优化。


public class Translate extends Thread{
    private Person p1;
    private Person p2;
    private int money;