java.util.concurrent.locks.Lock 提供更靈活的鎖操作:
lockInterruptibly()tryLock()、tryLock(timeout)new ReentrantLock(true) 公平鎖newCondition() 支持多等待隊列isLocked()、getHoldCount() 等ReentrantLock 實現wait/notify 解耦為對象,支持多條件隊列ReentrantReadWriteLock 實現import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
public static void main(String[] args) {
MyCount myCount = new MyCount("95599200901215522", 10000);
Lock lock = new ReentrantLock(); // 非公平鎖
ExecutorService pool = Executors.newCachedThreadPool();
pool.execute(new User("張三", myCount, -4000, lock));
pool.execute(new User("張三他爹", myCount, 6000, lock));
pool.execute(new User("張三他弟", myCount, -8000, lock));
pool.execute(new User("張三", myCount, 800, lock));
pool.shutdown();
}
}
class User implements Runnable {
private String name; private MyCount myCount; private int iocash; private Lock myLock;
User(String name, MyCount myCount, int iocash, Lock myLock) {
this.name = name; this.myCount = myCount; this.iocash = iocash; this.myLock = myLock;
}
public void run() {
myLock.lock(); // 獲取鎖
try {
System.out.println(name + "正在操作" + myCount + "賬戶,金額為" + iocash + ",當前金額為" + myCount.getCash());
myCount.setCash(myCount.getCash() + iocash);
System.out.println(name + "操作" + myCount + "賬戶成功,金額為" + iocash + ",當前金額為" + myCount.getCash());
} finally {
myLock.unlock(); // 必須在 finally 中釋放!
}
}
}
class MyCount {
private String oid; private int cash;
MyCount(String oid, int cash) { this.oid = oid; this.cash = cash; }
public int getCash() { return cash; }
public void setCash(int cash) { this.cash = cash; }
@Override public String toString() { return "MyCount{oid='" + oid + "', cash=" + cash + '}'; }
}
張三正在操作MyCount{oid='95599200901215522', cash=10000}賬戶,金額為-4000,當前金額為10000
張三操作MyCount{oid='95599200901215522', cash=6000}賬戶成功,金額為-4000,當前金額為6000
張三他爹正在操作MyCount{oid='95599200901215522', cash=6000}賬戶,金額為6000,當前金額為6000
張三他爹操作MyCount{oid='95599200901215522', cash=12000}賬戶成功,金額為6000,當前金額為12000
張三他弟正在操作MyCount{oid='95599200901215522', cash=12000}賬戶,金額為-8000,當前金額為12000
張三他弟操作MyCount{oid='95599200901215522', cash=4000}賬戶成功,金額為-8000,當前金額為4000
張三正在操作MyCount{oid='95599200901215522', cash=4000}賬戶,金額為800,當前金額為4000
張三操作MyCount{oid='95599200901215522', cash=4800}賬戶成功,金額為800,當前金額為4800
Process finished with exit code 0
線程串行訪問賬戶,餘額變更正確(10000→6000→12000→4000→4800)。