SYNC Statement

Marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a block of statements, and then releasing the lock.



class-id Account.
  working-storage section.    
  01 balance binary-long.
  01 r type Random value new Random.
  method-id new.
  procedure division using value init as binary-long.
      move init to balance
  end method.

  method-id Withdraw.
  procedure division using value amount as binary-long returning ret as binary-long.
  *> This condition will never be true unless the lock statement
  *> is commented out:
      if balance > 0
          display "< 0"
          raise new Exception("Negative Balance")
      sync on self
          if balance >= amount
               display "In critical section"
               *>display "Balance before Withdrawal :  " balance
               *>display "Amount to Withdraw        : -" amount
               compute balance = balance - amount
               *>display "Balance after Withdrawal  :  " balance
               move amount to ret
               display "In critical section"
               move 0 to ret
  end method.

  method-id DoTransactions.
  local-storage section.
  01 i binary-long.
  procedure division.
      perform varying i from 0 by 1 until i = 100
          invoke Withdraw(r::Next(1, 100))
  end method.
end class.