Java多线程同步教程--BusyFlag或Lock (下)
请首先阅读上篇:
Java多线程同步教程--BusyFlag或Lock (上)
我们首先开发一个BusyFlag的类,类似于C++中的Simaphore。
- public class BusyFlag {
- protected Thread busyflag = null;
- protected int busycount = 0;
-
- public synchronized void getBusyFlag() {
- while (tryGetBusyFlag() == false) {
- try {
- wait();
- } catch (Exception e) {}
- }
- }
-
- private synchronized boolean tryGetBusyFlag() {
- if (busyflag == null) {
- busyflag = Thread.currentThread();
- busycount = 1;
- return true;
- }
-
- if (busyflag == Thread.currentThread()) {
- busycount++;
- return true;
- }
- return false;
- }
-
- public synchronized void freeBusyFlag() {
- if(getOwner()== Thread.currentThread()) {
- busycount--;
- if(busycount==0) {
- busyflag = null;
- notify();
- }
- }
- }
-
- public synchronized Thread getOwner() {
- return busyflag;
- }
- }
注:参考Scott Oaks & Henry Wong《Java Thread》
BusyFlag有3个公开方法:getBusyFlag, freeBusyFlag, getOwner,分别用于获取忙标志、释放忙标志和获取当前占用忙标志的线程。使用这个BusyFlag也非常地简单,只需要在需要锁定的地方,调用BusyFlag的getBusyFlag(),在对锁定的资源使用完毕时,再调用改BusyFlag的freeBusyFlag()即可。下面我们开始改造上篇中的Account和ATM类,并应用BusyFlag工具类使得同时只有一个线程能够访问同一个账户的目标得以实现。首先,要改造Account类,在Account中内置了一个BusyFlag对象,并通过此标志对象对Account进行锁定和解锁:
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map;
-
- class Account {
- String name;
- //float amount;
-
- BusyFlag flag = new BusyFlag();
-
- //使用一个Map模拟持久存储
- static Map storage = new HashMap();
- static {
- storage.put("John", new Float(1000.0
补充:软件开发 , Java ,