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

菏泽市建设局网站林萌荣温州市网页制作

菏泽市建设局网站,林萌荣温州市网页制作,做塑料的网站有哪些,wordpress自动适应手机端一#xff0c;ReentrantLock 1.ReentrantLock是什么#xff1f; ReentrantLock实现了Lock接口#xff0c;是一个可重入且独占式的锁#xff0c;和Synchronized关键字类似#xff0c;不过ReentrantLock更灵活#xff0c;更强大#xff0c;增加了轮询、超时、中断、公平锁…一ReentrantLock 1.ReentrantLock是什么 ReentrantLock实现了Lock接口是一个可重入且独占式的锁和Synchronized关键字类似不过ReentrantLock更灵活更强大增加了轮询、超时、中断、公平锁和非公平锁等高级功能。 ReentrantLock 里面有一个内部类 Sync 继承 AQSAbstractQueuedSynchronizer添加锁和释放锁的大部分操作实际上都是在 Sync中实现的。Sync 有公平锁 FairSync 和非公平锁 NonfairSync 两个子类。 2.公平锁与非公平锁 公平锁先到先得原则。如果锁被线程释放之后先申请的线程先得到锁。公平锁性能较差一些因为公平锁为了保证事件上的绝对顺序上下文切换频繁非公平锁相对公平锁来说如果锁被线程释放之后后续所有申请的线程都有可能获得到锁不会按照某一个顺序来是随机的。非公平锁性能更高但是可能导致某些线程永远获取不到锁 3.ReentrantLock的使用 lock(): 加锁 , 如果获取不到锁就死等 . trylock( 超时时间 ): 加锁 , 如果获取不到锁 , 等待一定的时间之后就放弃加锁 . unlock(): 解锁 4.ReentrantLock与Synchronized区别 Sychronized依赖于JVM而ReentrantLock依赖于APISynchronized 关键字进行了很多优化但是这些优化都是在虚拟机层面实现的并没有直接暴露给我们。ReentrantLock 是 JDK 层面实现的也就是 API 层面需要 lock() 和 unlock() 方法配合 try/finally 语句块来完成所以我们可以通过查看它的源代码来看它是如何实现的Sychronized使用时不需要手动释放锁ReentrantLock使用时需要手动释放锁使用起来更加的灵活但是也容易遗漏unlockSychronized在申请锁失败时会死等知道获取到锁ReentrantLock可以通过trylock的方式等待一段时间之后就放弃等待Synchronized是非公平锁ReentrantLock默认是非公平锁可以通过构造方法传入一个true开启公平锁模式 更强大的唤醒机制 . synchronized 是通过 Object 的 wait / notify 实现等待 - 唤醒 . 每次唤醒的是一个随机等待的线程. ReentrantLock 搭配 Condition 类实现等待 - 唤醒 , 可以更精确控制唤醒某个指定的线程. ReentrantLock提供了一种能够中断等待锁的线程的机制通过 lock.lockInterruptibly() 来实现这个机制。也就是说正在等待的线程可以选择放弃等待改为处理其他事情。 5.可中断锁和不可中断锁有什么区别 可中断锁获取锁的过程中可以被中断不需要一直等到获取锁之后 才能进行其他逻辑处理。ReentrantLock 就属于是可中断锁。不可中断锁一旦线程申请了锁就只能等到拿到锁以后才能进行其他的逻辑处理。 synchronized 就属于是不可中断锁 6.如何选择使用哪个锁? 锁竞争不激烈的时候, 使用 synchronized, 效率更高, 自动释放更方便. 锁竞争激烈的时候, 使用 ReentrantLock, 搭配 trylock 更灵活控制加锁的行为, 而不是死等. 如果需要使用公平锁, 使用 ReentrantLock. 二Atomic原子类 1.什么是原子类 Atomic 翻译成中文是原子的意思。在化学上我们知道原子是构成一般物质的最小单位在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候一个操作一旦开始就不会被其他线程干扰。 所以所谓原子类就是具有原子操作特征的类 根据操作的数据类型可以将JUC包中的原子类分为四类 基本类型 AtomicInteger整型原子类AtomicLong长整型原子类AtomicBoolean布尔型原子类数组类型 AtomicIntegerArray整型数组原子类AtomicLongArray长整型数组原子类AtomicReferenceArray引用类型数组原子类引用类型 AtomicReference引用类型原子类AtomicMarkableReference原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来。AtomicStampedReference原子更新带有版本号的引用类型。该类将整数值与引用关联起来可用于解决原子的更新数据和数据的版本号可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。对象的属性修改类型 AtomicIntegerFieldUpdater:原子更新整型字段的更新器AtomicLongFieldUpdater原子更新长整型字段的更新器AtomicReferenceFieldUpdater原子更新引用类型里的字段 2.基本类型原子类 以AtomicInteger为例常用方法有 public final int get() //获取当前的值 public final int getAndSet(int newValue)//获取当前的值并设置新的值 public final int getAndIncrement()//获取当前的值并自增 public final int getAndDecrement() //获取当前的值并自减 public final int getAndAdd(int delta) //获取当前的值并加上预期的值 boolean compareAndSet(int expect, int update) //如果输入的数值等于预期值则以原子方式将该值设置为输入值update public final void lazySet(int newValue)//最终设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。3.基本数据类型优势 通过一个简单例子带大家看一下基本数据类型原子类的优势 1、多线程环境不使用原子类保证线程安全基本数据类型 class Test {private volatile int count 0;//若要线程安全执行执行count需要加锁public synchronized void increment() {count;}public int getCount() {return count;} }2、多线程环境使用原子类保证线程安全基本数据类型 class Test2 {private AtomicInteger count new AtomicInteger();public void increment() {count.incrementAndGet();}//使用AtomicInteger之后不需要加锁也可以实现线程安全。public int getCount() {return count.get();} }AtomicInteger 类主要利用 CAS (compare and swap) volatile 和 native 方法来保证原子操作从而避免 synchronized 的高开销执行效率大为提升。 三CSA 1.什么是CAS? CAS即compare and swap(比较与交换)它的主要思想很简单就是用一个预期值和一个要更新变量的值进行比较两值相等才会将新的值写入否则不会操作成功。 CAS 是一个原子操作底层依赖于一条 CPU 的原子指令。实际上Java的CAS利用的是unsafe这个类提供的CAS操作unsafe的CAS依赖于JVM针对于不同的操作系统实现Atomic::cmpxchgAtomic::cmpxchg的实现使用了汇编语言的CAS操作并使用CPU提供的lock机制保证其原子性。简而言之有了硬件层面的支持软件层面才可以做到 2.CAS操作 CAS涉及三个操作数 V要更新的变量E预期值N拟写入的新值 当且仅当V的值等于E的值时CAS通过原子方式用新值N来更新V的值如果不等说明已经有其他线程更新了V则当前线程放弃更新。 3.CAS的ABA问题 如果一个变量 V 初次读取的时候是 A 值并且在准备赋值的时候检查到它仍然是 A 值那我们就能说明它的值没有被其他线程修改过了吗很明显是不能的因为在这段时间它的值可能被改为其他值然后又改回 A那 CAS 操作就会误认为它从来没有被修改过。这个问题被称为 CAS 操作的 ABA问题。 对于这个问题我们解决的方法是给要修改的值引入版本号在CAS比较当前值和预期值相同的同时也需要比较版本号是否符合预期 CAS 操作在读取旧值的同时, 也要读取版本号. 真正修改的时候, 如果当前版本号和读到的版本号相同, 则修改数据, 并把版本号 1. 如果当前版本号高于读到的版本号. 就操作失败(认为数据已经被修改过了) 四AQS 1.AQS是什么 AQS 的全称为 AbstractQueuedSynchronizer 翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS就是一个抽象类主要用来构建锁和同步器。AQS 为构建锁和同步器提供了一些通用功能的实现因此使用 AQS 能简单且高效地构造出应用广泛的大量的同步器比如我们提到的ReentrantLockSemaphore等 2.AQS的原理是什么 AQS的核心思想就是如果被请求的共享资源空闲则将当前请求资源的线程设置为有效的工作线程并将共享资源设置为锁定状态如果被请求的共享资源被占用那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制这个机制AQS使用CLH锁队列实现的即将暂时获取不到锁的线程加载到队列当中。 CLH队列是一个虚拟的双向队列虚拟的双向队列即不存在队列实例仅存在节点之间的关联关系。AQS是将每一个请求共享资源的线程封装成一个CLH锁队列的一个结点来实现锁的分配。在CLH同步队列中一个结点表示一个线程它保存着线程的引用当前结点在队列中的状态前驱结点后继结点。 AQS的核心原理图  AQS使用int成员变量state表示同步状态 通过内置的线程等待队列来完成获取资源线程的排队工作。state变量由volatile修饰用于展示当前临界资源获锁情况。 // 共享变量使用volatile修饰保证线程可见性 private volatile int state;以ReentrantLock为例state初始值为0表示资源未锁定状态 。此时线程A调用lock()时底层会调用tryAcquire()方法独占该锁并将state 1此后其他线程想要再次tryAcquire()时都会失败直到A线程unlock()之后state 0其他线程才有机会获取该锁。ReentrantLock是一个可重入锁加锁多少次就需要解锁多少次直到state 0此时证明资源无锁状态其他线程均可获取。 以 CountDownLatch 以例任务分为 N 个子线程去执行state 也初始化为 N注意 N 要与线程个数一致。这 N 个子线程是并行执行的每个子线程执行完后countDown() 一次state 会 CAS(Compare and Swap) 减 1。等到所有子线程都执行完后(即 state0 )会 unpark() 主调用线程然后主调用线程就会从 await() 函数返回继续后余动作 3.Semaphore 有什么用 synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源而Semaphore(信号量)可以用来控制同时访问特定资源的线程数量。 Semaphore简单使用在某时刻同时存在NN n个线程来获取Semaphore中的共享资源但是Semaphore在创建实例对象时传入参数来设置同一时刻只能有n个对象访问其他线程都会阻塞等待直到有线程释放资源之后其他线程才可以获取但是只要同时访问线程数量为n其他线程就会阻塞  例 // 初始共享资源数量 final Semaphore semaphore new Semaphore(5); // 获取1个许可 semaphore.acquire(); // 释放1个许可 semaphore.release();此时只允许同时5个线程访问。用我们生活中的例子来讲一个加油站同时只能有5辆车加油其他车辆来到只能等待只有其他车辆完成加油之后这个位置空闲后续车辆才能加油 当初始资源数为1的时候Semaphore为排他锁 Semaphore有两种模式 公平模式调用acquire()方法的顺序就是获取许可证的顺序遵循FIFO,非公平模式抢占式执行 两种模式对应两个构造方法: 两个构造方法必须提供许可证数量第二个方法可以指定是否为公平模式默认是非公平模式 public Semaphore(int permits) {sync new NonfairSync(permits); }public Semaphore(int permits, boolean fair) {sync fair ? new FairSync(permits) : new NonfairSync(permits); }4.Semaphore的原理是什么 Semaphore是共享锁的一种实现它默认构造AQS的state为permits可以将permits的值看作许可证的数量只有拿到许可证的线程才能执行。 调用Semaphore.acquire()线程尝试获取许可证如果state 0的话则表示获取成功如果获取成功则进程CAS操作去修改state的值 state state - 1如果state  0 时则表示许可证数量不足此时将线程封装成一个结点加入到阻塞队列当中挂起线程。 调用Semaphore.release(); 线程尝试释放许可证并使用 CAS 操作去修改 state 的值 statestate1。释放许可证成功之后同时会唤醒同步队列中的一个线程。被唤醒的线程会重新尝试去修改 state 的值 statestate-1 如果 state0 则获取令牌成功否则重新进入阻塞队列挂起线程 5. CountDownLatch有什么用 CountDownLatch允许count个线程阻塞在一个地方直至所有线程的任务执行完毕才结束 CountDownLatch是一次性的计数器的值只能在构造方法中初始化一次之后没有任何机制再对其设置值当CountDownLatch使用完毕之后不能再被使用。 6.CountDownLatch 的原理是什么 CountDownLatch是一种共享锁的实现它默认构造AQS的state值作为count当线程使用countDown()方法时其实使用了tryReleaseShared以CAS的操作来减少state的值直至为0当调用await()方法时如果state不等于0证明还有线程没有执行完毕任务await()方法一值会阻塞也就是说await()方法之后的语句不会被执行直到count的个数位0也就是state 0await()方法之后的语句才执行。
http://wiki.neutronadmin.com/news/364751/

相关文章:

  • 教育类网站模板小学生班级优化大师
  • 个性化的个人网站简易网站优化要从哪些方面做
  • 免费建立教育网站惠州网站建设服务
  • 免费生成网站网址html5商城网页模板
  • 网站到期了网站充值怎么做分录
  • 章丘营销型网站建设wordpress home.php
  • wordpress文章列表不显示图片邢台网站优化公司
  • 网站备案网站directadmin网站储存目录
  • 潍坊建设厅网站自助友链平台
  • 网站营销活动策划四川省城乡和住建厅官网
  • 网站没有被百度收录 163com免费邮箱登
  • 网站建设背景文字太原市建设北路小学网站
  • 上海网站建设公司推荐排名建筑工程网首页
  • 怎么在网站底部做备案号下载代码的网站
  • 想要一个网站图库素材
  • 微商做图王官方网站国外优秀购物网站
  • 3 阐述网站建设的步骤过程天津网络推广网站建设公司
  • 开发东莞网站制作公司360建筑网如何修改名字
  • 浏览器网站进入口网站设计公司列表
  • 一级做爰片免费网站vx小程序制作
  • 哈尔滨网站建设渠道深圳分销网站设计哪家好
  • 各网站提交入口seoul是韩国哪个城市
  • 建三江廉政建设网站做同城购物网站
  • 建设部网站 自住房天津设计公司联系方式
  • 网站蜘蛛记录器 v1.2wordpress设置打赏
  • 金华网站建设yw126用户体验设计的重要性
  • 秦皇岛网站制作哪家好怎样做美瞳网站
  • 手工建站与模板网站的区别网络教学平台长沙理工
  • 做网站工资怎样查网站的注册地点
  • 教育机构网站是建筑设计工资一般多少