document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. package Demo13;
  2.  
  3. import java.util.Random;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6.  
  7. public class Runner {
  8.  
  9.     private Account acc1 = new Account();
  10.     private Account acc2 = new Account();
  11.  
  12.     private Lock lock1 = new ReentrantLock();
  13.     private Lock lock2 = new ReentrantLock();
  14.  
  15.     private void acquireLock(Lock firstLock, Lock secondLock) throws InterruptedException {
  16.         while(true){
  17.             //Acquire lock
  18.             boolean getFirstLock = false;
  19.             boolean getSecondLock = false;
  20.            
  21.            
  22.             try {
  23.                 getFirstLock =  firstLock.tryLock();
  24.                 getSecondLock = secondLock.tryLock();
  25.             } finally{
  26.                 if(getFirstLock && getSecondLock)
  27.                 {
  28.                     return;
  29.                 }
  30.                
  31.                 if(getFirstLock){
  32.                     firstLock.unlock();
  33.                 }
  34.                 if(getSecondLock){
  35.                     secondLock.unlock();
  36.                 }
  37.             }
  38.            
  39.             //Locks not acquire
  40.             Thread.sleep(1);
  41.         }
  42.     }
  43.  
  44.     public void firstThread() throws InterruptedException {
  45.         Random random = new Random();
  46.  
  47.         for (int i = 0; i < 10000; i++) {
  48.             acquireLock(lock1, lock2);
  49.             lock2.lock();
  50.             try {
  51.                 Account.transfer(acc1, acc2, random.nextInt(100));
  52.             } finally {
  53.                 lock1.unlock();
  54.                 lock2.unlock();
  55.             }
  56.         }
  57.     }
  58.  
  59.     public void secondThread() throws InterruptedException {
  60.         Random random = new Random();
  61.  
  62.         for (int i = 0; i < 10000; i++) {
  63.             acquireLock(lock2, lock1);
  64.             try {
  65.                 Account.transfer(acc2, acc1, random.nextInt(100));
  66.             } finally {
  67.                 lock1.unlock();
  68.                 lock2.unlock();
  69.             }
  70.         }
  71.     }
  72.  
  73.     public void finished() {
  74.         System.out.println("Account 1 Balance " + acc1.getBalance());
  75.         System.out.println("Account 2 Balance " + acc2.getBalance());
  76.         System.out.println("Total Balance "
  77.                 + (acc1.getBalance() + acc2.getBalance()));
  78.  
  79.     }
  80. }
');