1.新建Account类,使用ReentrantLock同步增加和减少金额方法。
package com.xkzhangsan.reentrantlockpack.bank; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Account { private double balance; private final Lock lock = new ReentrantLock(); public void addAmount(double amount){ lock.lock(); try { double tmp = balance; Thread.sleep(10); tmp+=amount; balance=tmp; } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void substractAmount(double amount){ lock.lock(); try { double tmp = balance; Thread.sleep(10); tmp-=amount; balance=tmp; } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
2.其他和https://www.cnblogs.com/xkzhangsanx/p/10759690.html一致。
注意释放锁
finally { lock.unlock(); }
3.测试结果
Account start money:1000.000000
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Company add 1000 balance:2000.0
Company add 1000 balance:3000.0
Bank substract 1000 balance:2000.0
Company add 1000 balance:3000.0
Bank substract 1000 balance:2000.0
Bank substract 1000 balance:1000.0
Account end money:1000.000000
参考:java7并发编程实战手册
GitHub地址:https://github.com/xkzhangsan/java-concurrent-practice