2012-10-01 47 views
1

我正在尝试多线程银行转账问题。但是,我遇到了正确同步线程的问题。定期在线程执行账户之间的转账后,它将进行测试以确保没有钱获得或完全损失。Java多线程银行转账,同步问题

当一个线程进入测试方法时,它应该设置一个标志,以防止任何其他线程进入传输方法,然后等待所有当前正在执行的线程传输结束。

public void transfer(int from, int to, int amount) {   
    //finish running all threads' current transactions before test 

    accounts[from].waitForAvailableFunds(amount); 
    if (!open) return;  

    //checks to see if any thread is currently testing 
    //if so, wait 
    while(flag) { 
     try { 
      wait(); 
     } catch (InterruptedException e) { /*ignore*/ } 
    } 

    //do not execute these two statements when a thread 
    //is performing a test 
    if (accounts[from].withdraw(amount)) { 
     accounts[to].deposit(amount); 

    } 

    if (shouldTest() && !flag) test(); 

} 

//only one thread can perform a test at any given moment 
public synchronized void test() {   

    //when test starts set a flag telling threads to 
    //not begin any new transfers 
    flag = true; 

    //wait for all threads currently performing transfers 
    //to finish current transfer before continuing 


    int sum = 0; 
    for (int i = 0; i < accounts.length; i++) { 
     System.out.printf("%s %s%n", 
       Thread.currentThread().toString(),accounts[i].toString()); 
     sum += accounts[i].getBalance(); 
    } 
    System.out.println(Thread.currentThread().toString() + 
      " Sum: " + sum); 
    if (sum != numAccounts * initialBalance) { 
     System.out.println(Thread.currentThread().toString() + 
       " Money was gained or lost"); 
     System.exit(1); 
    } else { 
     System.out.println(Thread.currentThread().toString() + 
       " The bank is in balance"); 
    } 

    //reset flag and notify threads test is complete. 
    flag = false; 
    notifyAll(); 
} 

首先,我甚至不积极我已经设置了标志并正确等待。其次,如何让进入测试方法的线程等待所有其他正在执行传输的线程完成当前传输。

感谢

回答

0

我认为你应该使用挥发性装饰标志,以确保当它在不同的线程发生变化,也受到影响。