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

30-结果分析

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

结果分析

Java并发API提供的一个类可实现具有锁或信号量功能的同步机制。它称为 Abstract QueuedSynchronizer ,顾名思义,它是一个抽象类。它提供的操作控制对临界区的访问,并管理阻塞的线程队列,并等待访问该部分。这些操作基于以下两种抽象方法。

  • tryAcquire() :调用该方法尝试访问临界区。如果调用它的线程可以访问临界区,则该方法返回 true 值;否则,它返回 false 值。
  • tryRelease() :调用该方法尝试释放对临界区的访问。如果调用它的线程可以释放访问权限,那么该方法返回 true 值;否则,它返回 false 值。

在这些方法中,必须实现控制访问临界区的机制。在这种情况下,实现 MyAbstractQueued Synchronizer 类,它扩展了 AbstractQueuedSynchronizer 类,并使用 Atomic Integer 变量实现抽象方法来控制对临界区的访问。如果锁是空闲的,则此变量将存储0值,以便线程可以访问临界区;如果锁被阻止,则该值为1,因此线程无权访问临界区。

使用 AtomicInteger 类提供的 compareAndSet() 方法可尝试将指定的值改为第一个参数,并将其赋予第二个参数。要想实现 tryAcquire() 方法,可以尝试将原子变量的值从0更改为1。同样,要想实现 tryRelease() 方法可以尝试将原子变量的值从1更改为0。

必须实现 AtomicInteger 类,因为 AbstractQueuedSynchronizer 类的其他实现(例如, ReentrantLock 使用的类)在内部实现为私有类。由于这是在使用它的类中执行的,因此无法访问它。

然后,实现 MyLock 类。这个类实现了 Lock 接口,并且有一个 MyQueuedSynchronizer 对象作为字段。为了实现 Lock 接口的所有方法,使用 MyQueuedSynchronizer 对象的方法。

最后,设计实现 Runnable 接口的 Task 类,并使用 MyLock 对象访问临界区。这个临界区让线程休眠2s。主类创建一个 MyLock 对象并运行共享该锁的10个 Task 对象。主类也尝试使用 tryLock() 方法访问锁。

当运行这个例子时,可以看到只有一个线程可以访问临界区,当该线程完成时,另一个线程才可以访问它。

可以用自己的 Lock 接口来打印关于其利用率的日志消息、控制锁定的时间或者实现高级同步机制来控制资源的访问,使其仅在特定时间可用。