当前位置: 首页 > news >正文

网站主页设计素材网站建设手机站

网站主页设计素材,网站建设手机站,wordpress 教垜,完整的网页设计代码案例一、简介 AQS,全称:AbstractQueuedSynchronizer,是一个JDK提供的用于构建锁、同步器等线程协作工具类的框架,内部维护FIFO双向队列(双向链表实现)。 AQS重要属性: // 表示同步状态。它既可以表…

一、简介

AQS,全称:AbstractQueuedSynchronizer,是一个JDK提供的用于构建锁、同步器等线程协作工具类的框架,内部维护FIFO双向队列(双向链表实现)。
AQS重要属性:

// 表示同步状态。它既可以表示独占模式下的锁状态,也可以表示共享模式下的资源数量。通过修改state字段,可以实现多线程的独占或共享模式‌
private volatile int state
// 当前持有独占锁的线程
private transient Thread exclusiveOwnerThread
// 头节点
private transient volatile Node head;
// 尾节点
private transient volatile Node tail;

Node节点重要属性:

// 加入队列的线程
volatile Thread thread;
// 前驱节点
volatile Node prev;
// 后继节点
volatile Node next;
// CANCELLED: 表示线程已经取消了对同步状态的请求。
// SIGNAL: 表示线程需要被唤醒(通常是因为其他线程释放了同步状态)。
// CONDITION: 表示线程正在等待某个条件。
// PROPAGATE: 表示下一次共享状态的释放应该传播到其他线程。
// 0: 初始状态,表示节点没有特定的状态。
volatile int waitStatus;
Node nextWaiter;

AQS 在 ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch、ThreadPoolExcutor 的 Worker 中都有运用(JDK 1.8),AQS 是这些类的底层原理。

二、实现自定义线程协作工具类

2.1 实现独占锁

重写AQS以下方法

boolean tryAcquire(int arg)
boolean tryRelease(int arg)
boolean isHeldExclusively()

调用AQS以下方法

public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}public final boolean release(int arg) {if (tryRelease(arg)) {Node h = head;if (h != null && h.waitStatus != 0)unparkSuccessor(h);return true;}return false;
}
2.2 实现共享锁

重写AQS以下方法

int tryAcquireShared(int arg)
boolean tryReleaseShared(int arg)

调用AQS以下方法

public final void acquireShared(int arg) {if (tryAcquireShared(arg) < 0)doAcquireShared(arg);
}public final boolean releaseShared(int arg) {if (tryReleaseShared(arg)) {doReleaseShared();return true;}return false;
}public final void acquireSharedInterruptibly(int arg)throws InterruptedException {if (Thread.interrupted())throw new InterruptedException();if (tryAcquireShared(arg) < 0)doAcquireSharedInterruptibly(arg);
}
2.3 示例
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class Test {class MySync extends AbstractQueuedSynchronizer {@Overrideprotected boolean tryAcquire(int arg) {if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int arg) {setExclusiveOwnerThread(null);setState(0);return true;}@Overrideprotected boolean isHeldExclusively() {return getState() == 1;}public Condition newCondition() {return new ConditionObject();}}class MyLock implements Lock {private MySync sync = new MySync();@Overridepublic void lock() {sync.acquire(1);}@Overridepublic void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Overridepublic boolean tryLock() {return sync.tryAcquire(1);}@Overridepublic boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(time));}@Overridepublic void unlock() {sync.release(1);}@Overridepublic Condition newCondition() {return sync.newCondition();}}public static void main(String[] args) throws Exception {Test test = new Test();MyLock myLock = test.new MyLock();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {myLock.lock();System.out.println(Thread.currentThread().getName() + "执行开始");Thread.sleep(5000L);System.out.println(Thread.currentThread().getName() + "执行结束");} catch (InterruptedException e) {e.printStackTrace();} finally {myLock.unlock();}}}, "t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {try {myLock.lock();System.out.println(Thread.currentThread().getName() + "执行开始");Thread.sleep(3000L);System.out.println(Thread.currentThread().getName() + "执行结束");} catch (InterruptedException e) {e.printStackTrace();} finally {myLock.unlock();}}}, "t2");Thread t3 = new Thread(new Runnable() {@Overridepublic void run() {try {myLock.lock();System.out.println(Thread.currentThread().getName() + "执行开始");Thread.sleep(1000L);System.out.println(Thread.currentThread().getName() + "执行结束");} catch (InterruptedException e) {e.printStackTrace();} finally {myLock.unlock();}}}, "t3");t1.start();t2.start();t3.start();}
}
  • 参考1
http://www.yayakq.cn/news/797525/

相关文章:

  • 射阳做企业网站多少钱回合网页游戏排行榜前十名
  • 做牛津布面料在哪个网站找客户wordpress 付费插件
  • 公司网站开发费进什么费用上海博大园林建设发展有限公司网站
  • svn教程图文详解 - 青岛网站建设咋样看网站域名是哪个服务商的
  • 万维网如何建设网站网站产品类别顺序如果修改
  • 权威的大良网站建设江阴服装外贸现状
  • 有名的网站建设公司百姓网网站源码
  • 浙江省住房和建设厅网站有关做洁净工程的企业网站
  • 云南省城乡建设厅网站wordpress如何上传mp3
  • 网站后台模板怎样使用什么网站做班服比较好
  • 西安免费做网站建设银行网站用户名是什么意思
  • 网站定制合同和模版的区别wordpress 获取路径
  • 大型做网站的公司wordpress 编辑页脚
  • 网站开发的工作要求上海关键词优化软件
  • 诛仙3官方网站做花灯答案金山手机网站建设
  • 网站代备深圳app定制开发报价单
  • 网站运行模式网站流量是怎么赚钱的
  • 网站建设厌倦云服务器拿来做网站
  • wordpress百度推广安徽谷歌seo
  • 力洋网站建设公司代做毕业设计实物网站
  • 网站建设职业发展前景和现状门户网站手机版
  • 免保证金入驻电商平台网站图片优化
  • 网站开发 方案百度网页制作
  • 建设银行手机查询网站泰安公司网站建设
  • 网站运营 解决方案白色网站源码
  • wordpress 站内资讯武侯区建设局网站
  • 织梦系统怎么做网站WordPress安装进入不了
  • 大连地区建设网站新手学做网站 下载
  • 网站做两个版本WordPress主题 luo
  • 自助免费搭建网站手机搞笑网站模板下载安装