#2a. Interleaving for getting "Insufficient funds exception". Start with a balance of $0:
Thread 1Thread 2
deposit(50)
compute 'balance+amt'
deposit(50)
compute 'balance+amt'
balance=50
balance=50
withdraw(100) -> insufficient funds
Essentially, the interleaving causes one of the $50 deposits to be forgotten, so when we go to withdraw $100, which should be there, we don't have enough.

#2b. Interleaving for getting a negative balance. Start with a balance of $50:
Thread 1Thread 2
withdraw(50)
if(amt>balance) -> false
withdraw(50)
if(amt>balance) -> false
balance-=50
balance-=50
Now we've got $-50 in the account.

#2c. Just synchronize the methods.