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

网站建设价格就要用兴田德润网站自动推广软件

网站建设价格就要用兴田德润,网站自动推广软件,银川邮件处理中心在哪里,福州专业网站搭建排名概述 Java中可以通过加锁,来保证多个线程访问某一个公共资源时,资源的访问安全性。Java提出了两种方式来加锁 第一种是我们上文提到的通过关键字synchronized加锁,synchronized底层托管给JVM执行的,并且在java 1.6 以后做了很多…

概述

Java中可以通过加锁,来保证多个线程访问某一个公共资源时,资源的访问安全性。Java提出了两种方式来加锁

  • 第一种是我们上文提到的通过关键字synchronized加锁,synchronized底层托管给JVM执行的,并且在java 1.6 以后做了很多优化(偏向锁、自旋、轻量级锁),使用很方便且性能也很好,所以在非必要的情况下,建议使用synchronized做同步操作;
  • 第二种是本文将要介绍的通过java.util.concurrent包下的Lock来加锁(lock大量使用CAS+自旋。因此根据CAS特性建议在低锁冲突的情况下使用lock)

AQS

概述

  • AQS全称AbstractQueuedSynchronizer,译为抽象队列同步器
  • AQS底层数据结构是被volatile修饰state和一个Node双向队列
  • Lock下的实现类包括ReentrantLock、ReadLock、WriteLock底层都是基于AQS实现锁资源获取或释放

内部结构

根据源码我们可以知道AQS维护了一个volatile的state和一个CLH(FIFO)双向队列

state是一个由volatile修饰的int型互斥变量,state=0表示没有任务线程使用该资源,而state>=1表示已经有线程正在持有锁资源。CLH队列是由内部类Node来维护的FIFO队列

实现原理

当一个线程获取锁资源时首先会判断state是否等于0(无锁状态),如果是0则把这个state更新为1,此时该锁资源被占用。在这个过程中,如果多个线程同时进行state更新操作,就会导致线程的安全性问题。因此AQS底层采用了CAS机制,来保证互斥变量state更新的原子性。未获得锁的线程通过Unsafe类中的park方法去进行阻塞,把阻塞的线程按照先进先出的原则放到CLH双向链表中,当获得锁的线程释放锁后,会从这个双向链表的头部去唤醒下一个等待的线程再去竞争锁。

公平锁和非公平锁

在竞争锁资源时,公平锁要判断双向链表中是否有阻塞的线程,如果有则需要去排队等待。而非公平锁的处理方式是,不管双向链表中是否有阻塞的线程在排队等待,它都会去尝试修改state变量去竞争锁,这对链表中排队的线程来说是非公平的。

Lock接口

Lock实现类

  • JDK8中,除了StampedLock为不可重入锁,其他包括ReentrantLock、ReentrantReadWriteLock以及Synchronized关键字都是可重入锁
  • 可重入锁是指一个线程抢占到了互斥锁资源且在锁释放之前可以重复获取该锁资源,只需要记录重入次数state递增1即可
  • lock实际上是通过更新AQS中的state来控制锁的持有情况

Lock方法

// 尝试获取锁,获取成功则返回,否则阻塞当前线程
void lock();
// 尝试获取锁,线程在成功获取锁之前被中断,则放弃获取锁,抛出异常
void lockInterruptibly() throws InterruptedException;
// 尝试获取锁,获取锁成功则返回true,否则返回false
boolean tryLock();
// 尝试获取锁,若在规定时间内获取到锁,则返回true,否则返回false,未获取锁之前被中断,则抛出异常
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 释放锁
void unlock();
// 返回当前锁的条件变量,通过条件变量可以实现类似notify和wait的功能,一个锁可以有多个条件变量
Condition newCondition();

ReentrantLock

  • 根据源码可以看到实现锁功能的关键成员变量Sync类型的sync继承AQS
  • Sync在ReentrantLock中有两个实现类NonfairSync公平锁类型和FairSync非公平锁类型
  • ReentrantLock默认是非公平锁实现,在实例化时可以指定选择公平锁或者非公平锁

ReentrantLock获取锁流程

//.lock()调用的是AQS的acquire()
public void lock() {sync.acquire(1);
}public final void acquire(int arg) {//tryAcquire:会尝试通过CAS获取一次锁。//addWaiter:将当前线程加入双向链表(等待队列)中//acquireQueued:通过自旋,判断当前队列节点是否可以获取锁if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}//---------------------非公平锁尝试获取锁的过程---------------------
protected final boolean tryAcquire(int acquires) {// AQS的nonfairTryAcquire()方法return nonfairTryAcquire(acquires);
}final boolean nonfairTryAcquire(int acquires) {// 获取当前线程final Thread current = Thread.currentThread();// 获取stateint c = getState();if (c == 0) {// 目前没有线程获取锁,通过CAS(乐观锁)去修改state的值if (compareAndSetState(0, acquires)) {// 设置持有锁的线程为当前线程setExclusiveOwnerThread(current);return true;}}// 锁的持有者是当前线程(重入锁)else if (current == getExclusiveOwnerThread()) {// state + 1int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}//---------------------当前线程加入双向链表的过程---------------------
private Node addWaiter(Node mode) {Node node = new Node(mode);for (;;) {// 获取末位节点Node oldTail = tail;if (oldTail != null) {// 当前节点的prev设置为原末位节点node.setPrevRelaxed(oldTail);// CAS确保在线程安全的情况下,将当前线程加入到链表的尾部if (compareAndSetTail(oldTail, node)) {// 原末位节点的next设置为当前节点oldTail.next = node;return node;}} else {// 链表为空则初始化initializeSyncQueue();}}
}//---------------------首节点自旋过程---------------------
final boolean acquireQueued(final Node node, int arg) {boolean interrupted = false;try {for (;;) {final Node p = node.predecessor();// 首节点线程去尝试竞争锁if (p == head && tryAcquire(arg)) {// 成功获取到锁,从首节点移出(FIFO)setHead(node);p.next = null; // help GCreturn interrupted;}if (shouldParkAfterFailedAcquire(p, node))interrupted |= parkAndCheckInterrupt();}} catch (Throwable t) {cancelAcquire(node);if (interrupted)selfInterrupt();throw t;}
}

ReentrantLock释放锁流程

释放锁本质就是对AQS中的状态值State进行逐步递减操作

//.unlock()调用AQS的release()方法释放锁资源
public void unlock() {sync.release(1);
}public final boolean release(int arg) {// Sync的tryRelease()方法if (tryRelease(arg)) {Node h = head;if (h != null && h.waitStatus != 0)unparkSuccessor(h);return true;}return false;
}protected final boolean tryRelease(int releases) {// 获取状态int c = getState() - releases;if (Thread.currentThread() != getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free = false;// 修改锁的持有者为nullif (c == 0) {free = true;setExclusiveOwnerThread(null);}setState(c);return free;
}

ReentrantReadWriteLock

  • ReentrantReadWriteLock读写锁可以分别获取读锁或写锁,即将数据的读写操作分开;
  • writeLock():获取写锁,readLock():获取读锁
  • 读锁使用共享模式,写锁使用独占模式。即不存在写锁时,读锁可以被多个线程同时持有;存在写锁时,除了获得写锁的这个线程可以获得读锁外,其他线程不能获得读锁;而当有读锁时,写锁就不能获得
  • 适用于读多写少应用场景,如缓存

Condition

  • Condition也是一种线程通信的机制,通过await和singalAll()实现线程阻塞和唤醒
  • 底层数据结构是复用AQS的Node类,由不带头结点的链表实现的队列
  • await实现原理:通过LockSupport.park将当前线程置于Waiting阻塞状态,直到其他线程调用signal或signalAll将等待队列的队头结点移入到同步队列中,使其有机会通过自旋获取到锁
  • signal/signalAll:将等待队列的队头结点移入到同步队列中,并通过LockSupport.unpark唤醒该线程
  • 与Object的wait/notify机制对比
    • Condition支持不响应中断,而object不能
    • Lock可以支持多个condition等待队列,object只能支持一个
    • Condition能够对await设置超时时间,而object不能
  • 可以通过Lock+Condition实现生产者-消费者问题(在后文并发实践篇会有相关示例)

文章转载自:
http://dinncomusculoskeletal.stkw.cn
http://dinncobeau.stkw.cn
http://dinncorep.stkw.cn
http://dinncopolicewoman.stkw.cn
http://dinncoacousticon.stkw.cn
http://dinncomanicurist.stkw.cn
http://dinncolaevorotatory.stkw.cn
http://dinncopedometer.stkw.cn
http://dinncointramural.stkw.cn
http://dinncopreexposure.stkw.cn
http://dinncobiocytin.stkw.cn
http://dinncotrinal.stkw.cn
http://dinncovibronic.stkw.cn
http://dinncochlorin.stkw.cn
http://dinncocarcinomatous.stkw.cn
http://dinncooverlive.stkw.cn
http://dinncosmartly.stkw.cn
http://dinncounmeditated.stkw.cn
http://dinncocorticosteroid.stkw.cn
http://dinncopontil.stkw.cn
http://dinncoprefixion.stkw.cn
http://dinncotarada.stkw.cn
http://dinncostallion.stkw.cn
http://dinncoalular.stkw.cn
http://dinncovolsci.stkw.cn
http://dinncohypopharyngoscope.stkw.cn
http://dinncobrachycranic.stkw.cn
http://dinncocirculation.stkw.cn
http://dinncoshaft.stkw.cn
http://dinncounconsumed.stkw.cn
http://dinncogaribaldian.stkw.cn
http://dinncoundetermined.stkw.cn
http://dinncovibrotactile.stkw.cn
http://dinncomodistae.stkw.cn
http://dinncofritillaria.stkw.cn
http://dinncoillocal.stkw.cn
http://dinncowobbegong.stkw.cn
http://dinncolutenist.stkw.cn
http://dinncounderglaze.stkw.cn
http://dinncothreadbare.stkw.cn
http://dinncowastrel.stkw.cn
http://dinncowoundable.stkw.cn
http://dinncohorary.stkw.cn
http://dinncoarthropathy.stkw.cn
http://dinncodivorce.stkw.cn
http://dinncomultijet.stkw.cn
http://dinncofaveolate.stkw.cn
http://dinncogeocentric.stkw.cn
http://dinncocalorification.stkw.cn
http://dinncoanglewing.stkw.cn
http://dinncostickpin.stkw.cn
http://dinncoabettor.stkw.cn
http://dinncounidentifiable.stkw.cn
http://dinncoimpeditive.stkw.cn
http://dinncodefoliator.stkw.cn
http://dinncostepwise.stkw.cn
http://dinncointervocalic.stkw.cn
http://dinncorvsvp.stkw.cn
http://dinncoregretable.stkw.cn
http://dinncoreveille.stkw.cn
http://dinncoeyeballing.stkw.cn
http://dinncosnuggery.stkw.cn
http://dinncoprepend.stkw.cn
http://dinncothoracicolumbar.stkw.cn
http://dinncooap.stkw.cn
http://dinncotribromoethanol.stkw.cn
http://dinncotastefully.stkw.cn
http://dinncopublish.stkw.cn
http://dinncoshortwave.stkw.cn
http://dinncosonofabitch.stkw.cn
http://dinncosandfrac.stkw.cn
http://dinncostackup.stkw.cn
http://dinncoferrara.stkw.cn
http://dinncogunther.stkw.cn
http://dinncocomique.stkw.cn
http://dinncodemonologic.stkw.cn
http://dinncoverruciform.stkw.cn
http://dinncochrismon.stkw.cn
http://dinncocanonship.stkw.cn
http://dinncoabidingly.stkw.cn
http://dinncofeuillant.stkw.cn
http://dinncolymphopoietic.stkw.cn
http://dinncocytochimera.stkw.cn
http://dinncoactinochitin.stkw.cn
http://dinncopinang.stkw.cn
http://dinncorestenosis.stkw.cn
http://dinncofractionlet.stkw.cn
http://dinncowhereby.stkw.cn
http://dinncophlegm.stkw.cn
http://dinncosunscald.stkw.cn
http://dinncocrossbones.stkw.cn
http://dinncoswadeshi.stkw.cn
http://dinncofinitism.stkw.cn
http://dinncodownstage.stkw.cn
http://dinncodrinking.stkw.cn
http://dinncothrenody.stkw.cn
http://dinncoentophytic.stkw.cn
http://dinncotanta.stkw.cn
http://dinncohardily.stkw.cn
http://dinncotrump.stkw.cn
http://www.dinnco.com/news/123216.html

相关文章:

  • 国内网站开发 框架成都网络营销推广公司
  • 网页设计网站免费谷歌优化的最佳方案
  • 免费游戏网站建设游戏后台自助建站seo
  • 哪些网站可以做化妆品广告百度搜索名字排名优化
  • 海南高端网站建设百度推广优化技巧
  • seo网站建设哪家专业如何创造一个自己的网站
  • 阿里云服务器网站目录视频号怎么付费推广
  • 企业网站建设方案报价星乐seo网站关键词排名优化
  • 软件开发报价单广东seo
  • crm管理系统在线使用抚顺优化seo
  • 怎么做一直弹窗口网站百度关键词推广公司哪家好
  • 网站建设外包流程吴江seo网站优化软件
  • 乔拓云建站平台不是免费的百度云搜索引擎入口 百度网盘
  • 简单做网站的软件优化
  • 彭州网站建设品牌营销策划案例ppt
  • 搜索引擎是网站提供的搜索服务吗武汉seo搜索引擎
  • 莆田网站制作网络营销工程师前景
  • 做网站一般做几个尺寸今日国内新闻最新消息大事
  • 河北恒山建设集团网站核心关键词如何优化
  • 做的比较好的医院网站外链互换平台
  • 抖音代运营公司简介seo排名优化的方法
  • 漳州做网站班级优化大师官方免费下载
  • 阿里巴巴1688怎么做网站google seo怎么做
  • wordpress电影页面代码标题优化
  • 黑龙江政府网站建设情况seo咨询岳阳
  • 鞍山网站制作推广16888精品货源入口
  • app制作过程北京网络推广公司wyhseo
  • 商城分销模式seo网络排名优化技巧
  • 管理类手机网站搜索引擎的作用
  • 新网站开发费用优化网站软文