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

电子商城网站开发项目经验h5网站是什么意思

电子商城网站开发项目经验,h5网站是什么意思,软件工程属于哪个大类,企业网站建设存在的不足与困难一、为什么要用AQS同步框架#xff1f; 开发者如果不了解JMM和多线程编程#xff0c;就会写出很多线程不安全的程序#xff0c;即使是经验丰富的程序员#xff0c;并发编程也难免会出错。 而对于java程序员来说#xff0c;并发编程就变得容易得多了#xff0c;因为并发编…一、为什么要用AQS同步框架 开发者如果不了解JMM和多线程编程就会写出很多线程不安全的程序即使是经验丰富的程序员并发编程也难免会出错。 而对于java程序员来说并发编程就变得容易得多了因为并发编程大师Doug Lea为Java开发者提供了很多的并发容器和框架而AQS就是java并发包下的一个核心框架。 AQS是抽象队列同步器是用来构建Lock锁和同步组件的基础框架JUC包下的很多锁和同步组件都是基于AQS构建的比如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore。 为什么说AQS是构建Lock锁和同步组件的基础框架呢 这里补充一点Lock和synchronized关键字的区别的知识: synchronized关键字是JVM层面上实现的而Lock是JUC包下的一个接口synchronized让获取锁的线程执行完同步代码之后释放锁线程执行发生异常的情况下jvm会让线程释放锁使用Lock的话需要程序员显式地在finally块中释放锁不然会造成死锁synchronized会让一直没获取到锁的线程阻塞等待而Lock没有获取锁可以选择不用一直等待synchronized在发生异常的时候会自动释放占有的锁不会出现死锁Lock在发生异常的时候不会主动释放占用的锁必须手动unlock来释放锁可能会引起死锁的发生synchronized无法判断锁的状态而Lock可以判断synchronized是可重入锁不响应中断非公平的而Lock是可重入锁可判断可公平的在性能上如果是并发量小的话synchronized效率高并发量高的话Lock高。Lock还可以提高多个线程读操作的效率可以通过ReadWriteLock实现读写分离ReentrantLock提供了多样化的同步比如有时间限制的同步可以被Interrupt的同步 设想一下如果要实现线程的同步和锁机制需要考虑哪些问题 如何去获取锁和释放锁如何处理同步状态竞争失败时线程如何处理 而上述问题AQS已经帮你解决了 AQS实现了对同步状态的原子性管理AQS实现了对线程阻塞和解除阻塞的管理AQS实现了对同步队列的管理 Lock锁如何使用AQS AQS是实现锁的关键在锁的实现中聚合同步器利用同步器实现锁的语义。以ReentrantLock为例它内部聚合了一个同步器Sync,这个同步器继承了AQS 如何使用AQS实现线程同步 AQS定义了若干同步状态获取和释放的方法来供自定义同步组件使用同步器的主要使用方式是继承子类通过继承AQS并实现它的抽象方法来管理同步状态在抽象方法实现中免不了对同步状态进行更改这时就需要使用同步器提供的3个方法(getState()、setState(int newState)和compareAndSetState(int expectint update))来进行操作因为它们能够保证原子性的修改同步状态state字段。AQS既支持独占式地获取同步状态也可以支持共享式地获取同步状态这样就可以方便实现不同类型的同步组件。 二、什么是AQS同步框架 AQS是用来构建锁或者其他同步组件的基础框架它使用了一个int成员变量state表示同步状态通过内置的FIFO双向虚拟队列来完成资源获取线程的排队工作并发包的作者Doug Lea期望AQS能够成为实现大部分同步需求的基础。 AQS使用的设计模式 AQS的设计是基于 模板方法模式 的使用AQS需要继承它并重写指定的方法随后将同步器组合在自定义同步组件的实现中并调用同步器提供的模板方法而这些模板方法将会调用使用者重写的方法。 同步器可重写的方法有哪些 在重写AQS指定的方法时需要使用AQS提供的如下3个方法来访问或修改同步状态 getState():获取当前的同步状态setState(int newState):设置当前同步状态compareAndSetState(int expect,int update):使用CAS设置当前状态该方法能够保证状态设置的原子性CAS机制实现 AQS提供的模板方法有哪些部分 AQS提供的模板方法基本分为3类独占式获取与释放同步状态、共享式获取与释放同步状态和查询同步队列中的等待线程的情况。 三、AQS的底层原理源码分析 笔者打算从使用者的角度来分析AQS的底层因此下面用AQS去实现一个简单的独占锁独占锁就是在同一时刻只能有一个线程获取到锁其他没有获取到锁的线程进入同步队列中等待。 用AQS实现一个简单的独占锁Mutex代码来自AQS源码注释 package com.demo.LockTest;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 Mutex implements Lock {//静态内部类自定义同步器private static class Sync extends AbstractQueuedSynchronizer {//是否被占用protected boolean isHeldExclusively() {return getState() 1;}//当状态为0的时候获取锁public boolean tryAcquire(int acquires) {if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}//释放锁将状态设置为0protected boolean tryRelease(int releases) {//释放锁操作必须拥有锁否则抛出异常if (getState() 0) throw new IllegalMonitorStateException();setExclusiveOwnerThread(null);setState(0);return true;}//返回一个Condition每个Condition都包含了一个condition队列Condition newCondition() {return new ConditionObject();}}/*** 然后仅仅需要将同步操作代理到Sync上*/private final Sync sync new Sync();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);}public boolean isLocked() {return sync.isHeldExclusively();}public boolean hasQueuedThreads() {return sync.hasQueuedThreads();}Overridepublic Condition newCondition() {return sync.newCondition();} }上面的独占锁Mutex是一个自定义的同步组件Mutex中定义了一个静态内部类该内部类继承了AQS并实现了独占式获取和释放同步状态。在tryAcquire(int acquire)方法中使用CAS机制设置同步状态为1并将当前线程标记为拥有锁的线程否则进入同步队列中等待。tryRelease(int releases)方法中只是将同步状态设置为0然后将拥有锁的线程设置为null。 在Mutex的实现中可以发现用户使用这个类的时候不会直接和内部同步器交互被设为private而是通过调用Mutex提供的方法来使用独占锁。而Mutex的方法实现仅仅是去调用了同步器中的模板方法而已这样就大大降低了开发一个可靠自定义同步组件的门槛。 AQS是怎么实现线程同步的 从实现的角度分析线程同步主要包括 同步队列独占式同步状态的获取与释放共享式同步状态的获取与释放超时获取同步状态等同步器的核心数据结构与模板方法 1同步队列 AQS依赖内部的同步队列来完成同步状态的管理当前线程获取同步状态失败时同步器会将当前线程以及等待状态等信息封装成一个结点(Node)并将其加入同步队列同时阻塞当前线程当同步状态释放时会把首结点唤醒使其再次尝试获取同步状态。 同步队列中的节点Node用来保存获取同步状态失败的线程引用、等待状态以及前驱和后继节点。 Node prev:前驱节点当节点加入同步队列时被设置尾部添加Node next:后继节点Thread waiter:等待队列中的后继节点若当前节点是共享的那么这个字段将是一个SHARED常量即节点类型独占和共享和等待队列中的后继节点共用同一个字段?。int status:等待状态包含CACELLED(1)、SIGNAL(-1)、CONDITION(-2)、PROPAGATE(-3)、INITIAL(0),后续会详细介绍这些状态 节点是构成同步队列或等待队列的基础AQS拥有首节点(head)和尾节点(tail)没有成功获取同步状态的线程将会成为节点加入该队列的尾部同步队列的基本结构如下所示 注意看AQS包含了两个节点类型的引用一个指向head节点一个指向tail节点。 AQS将节点加入到同步队列 首结点的设置 同步队列遵循FIFO先进先出的首节点是获取同步状态成功的节点首节点的线程在释放同步状态的时候会去唤醒后继节点而后继节点在获取到同步状态时就会将自己设置为首结点过程如下 请注意设置首节点是通过获取同步状态成功的线程来完成的由于只有一个线程能够成功获取到同步状态因此设置头节点的方法不需要CAS来保证也是线程安全的它只需要将首节点设置成为原首节点的后继节点并断开原首节点的next引用即可。 2独占式同步状态的获取和释放 通过调用AQS的acquireint arg方法可以获取同步状态这个方法不响应中断即线程获取同步状态失败后进入同步队列中后续对该线程进行中断操作的时候这个线程也不会从同步队列中移除。
http://www.zqtcl.cn/news/855024/

相关文章:

  • 站长素材ppt模板免费下载网站开发视频教程迅雷下载
  • 建设一个网站怎么赚钱南京江北新区房价走势最新消息
  • 一个网站怎么做软件下载互联网投放渠道有哪些
  • 手机网站建设进度环境设计排版素材网站
  • 网站开发众筹地推网推平台
  • 长沙互联网网站建设wordpress标签id在哪里修改
  • 企业网站的建设 摘要大连网站设计策划
  • 做房地产一级市场的看什么网站网络营销外包推广方式
  • 网站建设基本流程包括哪几个步骤网站建设策划书网站发布与推广
  • 徐州整站优化手机网页端
  • 深圳中瑞建设集团官方网站宁波seo快速优化教程
  • 福田网站制作哪家好昆山企业网站建设公司
  • wordpress快六安网站自然排名优化价格
  • 网站的线下推广怎么做的系统官网网站模板下载安装
  • 北京网站优化推广公司企业网站建设费怎么核算
  • 网站建设vps个人如何做网站推广
  • 小语种网站怎么设计网页制作公司 大连
  • 贵港市城乡住房建设厅网站菜鸟教程网站
  • 广州网站建设找哪家免费搭建网站的软件
  • 培训班管理系统 免费太原优化网站排名
  • 上海怎么做网站网站让图片充满屏幕怎么做
  • 哈尔滨营销网站建设wordpress 加载图片不显示
  • 电商网站功能结构图网站做中秋专题怎么弄
  • 深圳专业建站平台陕西省建设工程质量安全监督总站网站
  • 制作网页的网站的软件是用户反馈数据分析软件园
  • 南京 做网站seo查询网站
  • 卖高仿名牌手表网站共享wifi小程序搭建
  • c#网站开发模板想在意大利做购物网站
  • 2015做那些网站能致富60天做网站
  • 沈阳个人建站模板网站图片计时器怎么做