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

上海seo整站优化沃尔玛网上商城

上海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.hkea.cn/news/14486575/

相关文章:

  • 河南建设厅网站首页html简单网页模板
  • 河南做网站哪家好网站平台建设流程
  • 长春有免费做网站的么萍乡建网站
  • 微信网站收钱吗wordpress菜单怎么添加图片
  • 建设网站费用分析建设网络强国征文
  • 做邮轮上哪个网站订票好文昌品牌网站建设费用
  • 关于农产品电子商务网站的建设东莞做网站制作
  • dz做电影网站wordpress页面定制
  • 潍坊网站建设定制wordpress阅读随机增加
  • 老师用什么网站做ppt远程it外包服务
  • 保定网站建设苗木平面设计师的工作内容
  • 网站设计的设计方案必要这个网站怎么样
  • 制作手机网站什么软件网站建设中的智能元素
  • 电商网站开发工具教育培训机构排名前十
  • 网站建设公司需要具备什么搜索引擎禁止的方式优化网站
  • 大气的企业网站教学设计代做去什么网站
  • 河南省 门户网站建设要求泉州网络seo
  • 如何删除网站后台的文章网站建设公司词
  • 外贸网站是怎么做的企业展馆展厅设计
  • 网站开发还是软件开发wordpress 替换头像
  • 湖北皇奥建设工程有限公司网站建设环境竣工验收网站
  • 网站备案步骤说一说网站建设的含义
  • 百度搜索网站显示图片平面设计专用网站
  • 宝石网站建设套用模板网站
  • 东莞做网站系统网站建设表格代码
  • 温州建网站电子商务网站设计的原则
  • 绍兴高兴区建设网站wordpress怎么导入主题
  • 龙采网站建设网站建设设计技巧
  • 广东泰通建设有限公司网站贵州健康码app下载
  • 驻马店网站优化手机软件应用市场