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

网站个别页面做seowordpress维护页面插件

网站个别页面做seo,wordpress维护页面插件,seo是什么职位的简称,全国城市感染率排名概述 Java中可以通过加锁#xff0c;来保证多个线程访问某一个公共资源时#xff0c;资源的访问安全性。Java提出了两种方式来加锁 第一种是我们上文提到的通过关键字synchronized加锁#xff0c;synchronized底层托管给JVM执行的#xff0c;并且在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和一个CLHFIFO双向队列 state是一个由volatile修饰的int型互斥变量state0表示没有任务线程使用该资源而state1表示已经有线程正在持有锁资源。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继承AQSSync在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)) {// 成功获取到锁从首节点移出FIFOsetHead(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不能可以通过LockCondition实现生产者-消费者问题(在后文并发实践篇会有相关示例)
http://www.w-s-a.com/news/988094/

相关文章:

  • 做网站得花多钱乡村振兴网站建设
  • 站设计培训课程wordpress自动回复
  • 上海闵行区 网站建设永久免费crm软件下载
  • 天津营销网站建设公司排名台州网站排名公司
  • 环保网站 怎么做物流网站的功能与特色
  • 网站多久才会被收录服务器租用泰海
  • 电商网站建设合同模板临汾推广型网站建设
  • 天猫商务网站建设目的长春网站设计
  • 公司网站建设会议纪要昆山高端网站建设机构
  • 做消费网站流程深圳网站设计价格
  • 做电影网站怎么接广告中国最新军事新闻视频
  • 网站推广设计做哪些设置自动删除的wordpress
  • 东莞东坑网站设计专业网站制作设
  • 网站怎么做现场直播视频成都科技网站建设找
  • 个人网页设计步骤网站没有内容 能做优化吗
  • 专业网站建设公司招聘网站排行榜
  • 网站建设规范方法企业解决方案架构
  • ae做网站导航wordpress门户
  • 重庆市网站备案材料云南做网站
  • 网页设计模板网站免费珠海视窗网
  • 茂名模板建站定制WordPress注册不提示
  • 陕西营销型手机网站建设深圳制作网站服务
  • 受欢迎的锦州网站建设Wordpress 图片左右滑动
  • 湖南优化网站建设线上网站建设需求
  • 建什么类型的网站访问量比较大哪些外包公司比较好
  • php网站地图外贸建站哪家强外贸网站怎么做
  • 宁波五金网站建设中国建筑网官网投诉查询
  • 哪个网站注册域名便宜免费流程图制作网站
  • 潍坊做网站南宁网站seo优化公司
  • 网站建设的基本技术步骤无网站营销