打个比喻:
有2个账户int x=1;
int y=2;有1个方法是取货:/**
 * 提取货物
 * @param id 
 *   提取人的id号
 */
public void getObject(int id){
// ... ...
}要求:当2个人同时各自拿着不同的账号去取货时(即,2个线程同时调用getObject方法)
可以同时为2个人取货(即:getObject()方法可以支持多线程调用)当2个人同时拿着同一个账号去取货时(即,2个线程同时调用getObject方法)
就必须排队第一个取好了第二个再取 (即:getObject()方法可以不支持多线程 synchronized 效果 )

解决方案 »

  1.   

    你提货那个方法的类里面增加一个Account类的属性
    getObject()方法把那个属性锁起来就行了
      

  2.   

    当2个人同时拿着同一个账号去取货时(即,2个线程同时调用getObject方法)
    就必须排队第一个取好了第二个再取 (即:getObject()方法可以不支持多线程 synchronized 效果 )这个你就必须自己建个锁,自己维护。如果你的
    public void getObject(int id){
    // ... ...
    }
    操作不耗时的话,建议还是对id进行加锁,这样不容易出错。如果getObject(int id)方法耗时 你可以在进行实质上操作的时候加锁
      

  3.   

    一个账户一把锁,不同账户不同锁 ??大部分的好像都怎么说 能给个简单的示例代码吗? 
    只能在public void getObject(int id)方法内进行操作还有1楼的Account类是干嘛用的 能说明并展示简单示例代码吗?
      

  4.   

    大意Object accountLock1 = new Object();
    Object accountLock2 = new Object();public void getObject(int id){
    Ojbect lock = null;
    if (id == 1) 
        lock = accountLock1;
    else if (id == 2) 
        lock = accountLock2;
    synchronized(lock) {
    //........
    }
    }
      

  5.   

    Account类就是用户用来提取货物的账户类,
    每个人来必须持有一个账户,线程就锁定这个账户就可以了
    如果不同的账户相互之间拿货不会有干扰
    如果两个相同的账户就会产生同步,就是一个先拿,拿完了后面的才能拿
      

  6.   


    HashMap<Integer,Object> locks = new HashMap<Integer,Object>();
    {
        locks.put(1,new Object());
        locks.put(2,new Object());
    }public void getObject(int id){
       synchronized(locks.get(id)){
          //
       }
    }
      

  7.   

    6楼的朋友虽然能够决绝问题
    但是...  如果账号有成千上万个 不可能写几万的IF吧8楼的朋友 Account 是什么类?? java里面(JDK1.6)找不到 是J2SE吗??
    请写些简单的代码来表示好吗 谢谢10楼的和6楼的其实差不多
      

  8.   

    就写了一个class,具体困难更楼主不太一样,重点在于synchronized(intern字符串)
    public class Test extends Thread {  @Override
      public void run() {
        while (true) {
          getObject((int) (Math.random() * 100));
          getObject(1000);
        }
      }  public void getObject(int id) {
        String lock = String.valueOf(id).intern();
        synchronized (lock) {
          System.out.printf("%s: %d START%n", getName(), id);
          try {
            sleep(500);
          } catch (InterruptedException e) {
          }
          System.out.printf("%s: %d END%n", getName(), id);
        }
      }  public static void main(String[] args) throws Exception {
        new Test().start();
        new Test().start();
        new Test().start();
      }
    }