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.创建一个名为 lock 的 MyLock 对象:
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");