当前位置:嗨网首页>书籍在线阅读

29-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤来实现本案例。

1.创建一个 MyAbstractQueuedSynchronizer 类来扩展 AbstractQueued-Synchronizer 类:

public class MyAbstractQueuedSynchronizer extends
                                AbstractQueuedSynchronizer {

2.声明一个 AtomicInteger 类型的 state 私有字段:

private final AtomicInteger state;

3.实现该类的构造方法以初始化其字段:

public MyAbstractQueuedSynchronizer() {
  state=new AtomicInteger(0);
}

4.实现 tryAcquire() 方法。该方法试图将状态变量的值从0改为1。如果可以,则它会返回 true ;否则,它返回 false

@Override
protected boolean tryAcquire(int arg) {
  return state.compareAndSet(0, 1);
}

5.实现 tryRelease() 方法。该方法试图将状态变量的值从1改为0。如果可以,则它会返回 true ;否则,它返回 false

@Override
protected boolean tryRelease(int arg) {
  return state.compareAndSet(1, 0);
}

6.创建一个 MyLock 类并指定它实现 Lock 接口:

public class MyLock implements Lock{

7.声明一个 AbstractQueuedSynchronizer 类型的 sync 私有字段:

private final AbstractQueuedSynchronizer sync;

8.实现类的构造方法,从而可以用新的 MyAbstractQueuedSynchronizer 对象来初始化 sync 属性:

public MyLock() {
  sync=new MyAbstractQueuedSynchronizer();
}

9.实现 lock() 方法。调用同步对象的 acquire() 方法:

@Override
public void lock() {
  sync.acquire(1);
}

10.实现 lockInterruptibly() 方法。调用同步对象的 acquireInterruptibly() 方法:

@Override
public void lockInterruptibly() throws InterruptedException {
  sync.acquireInterruptibly(1);
}

11.实现 tryLock() 方法。调用同步对象的 tryAcquireNanos() 方法:

@Override
public boolean tryLock() {
  try {
    return sync.tryAcquireNanos(1, 1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
    Thread.currentThread().interrupt();
    return false;
  }
}

12.用两个参数实现 tryLock() 方法的另一个版本:一个 long 类型的 time 参数和一个 TimeUnit 类型的 unit 参数。调用同步对象的 tryAcquireNanos() 方法:

@Override
public boolean tryLock(long time, TimeUnit unit) throws
                                 InterruptedException {
    return sync.tryAcquireNanos(1, TimeUnit.NANOSECONDS
                                       .convert(time, unit));
}

13.实现 unlock() 方法。调用同步对象的 release() 方法:

@Override
public void unlock() {
    sync.release(1);
}

14.实现 newCondition() 方法。创建同步对象内部类的新对象,即 ConditionObject

@Override
public Condition newCondition() {
  return sync.new ConditionObject();
}

15.创建一个 Task 类并指定它实现 Runnable 接口:

public class Task implements Runnable {

16.声明一个 MyLock 类型的 lock 私有字段:

private final MyLock lock;

17.声明一个 String 类型的 name 私有字段:

private final String name;

18.实现该类的构造方法以初始化其字段:

public Task(String name, MyLock lock){
  this.lock=lock;
  this.name=name;
}

19.实现类的 run() 方法。获取锁,使线程休眠2s,然后释放锁对象:

@Override
public void run() {
  lock.lock();
  System.out.printf("Task: %s: Take the lock\n",name);
  try {
    TimeUnit.SECONDS.sleep(2);
    System.out.printf("Task: %s: Free the lock\n",name);
  } catch (InterruptedException e) {
    e.printStackTrace();
  } finally {
    lock.unlock();
  }
}

20.创建一个 Main 类和一个 main() 方法来实现本案例的主类:

public class Main {
  public static void main(String[] args) {

21.创建一个名为 lockMyLock 对象:

MyLock lock=new MyLock();

22.创建并执行10个 Task 任务:

for (int i=0; i<10; i++){
  Task task=new Task("Task-"+i,lock);
  Thread thread=new Thread(task);
  thread.start();
}

23.尝试用 tryLock() 方法获取锁。等待1s,如果没有得到锁,则打印一条消息,然后再试一次:

boolean value;
do {
  try {
    value=lock.tryLock(1,TimeUnit.SECONDS);
    if (!value) {
      System.out.printf("Main: Trying to get the Lock\n");
    }
  } catch (InterruptedException e) {
    e.printStackTrace();
    value=false;
  }
} while (!value);

24.打印一条消息,表明已经获得了锁并释放它:

System.out.printf("Main: Got the lock\n");
lock.unlock();

25.写一条表示程序结束的消息:

System.out.printf("Main: End of the program\n");