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

网站建设与管理方案的总结找工程去哪个网站

网站建设与管理方案的总结,找工程去哪个网站,多语言企业网站建设费用,网上做公益的网站在开发过程中#xff0c;如果需要开发者自主实现一把锁#xff0c;就必须了解锁策略和锁的实现原理。 目录 锁策略 乐观锁和悲观锁 互斥锁和读写锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 公平锁和非公平锁 可重入锁和不可重入锁 死锁 发生死锁的必要条件 synchr…在开发过程中如果需要开发者自主实现一把锁就必须了解锁策略和锁的实现原理。 目录 锁策略 乐观锁和悲观锁 互斥锁和读写锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 公平锁和非公平锁 可重入锁和不可重入锁 死锁 发生死锁的必要条件 synchronized锁 synchronized的锁升级 CAS指令 编译器JVM的其他优化 锁消除 锁粗化 ReentrantLock锁 ReentrantLock的用法 synchronized与ReentrantLock的区别 锁策略 常见的锁策略有 乐观锁和悲观锁互斥锁和读写锁轻量级锁和重量级锁自旋锁和挂起等待锁公平锁和非公平锁可重入锁和不可重入锁乐观锁和悲观锁 就像名字一样乐观锁假设一般情况下数据不会发生冲突只有在修改数据操作时才会检测数据是否发生冲突一旦发生冲突返回错误信息交给用户做决定而悲观锁假设每次数据操作时都会发生冲突每次对数据进行操作时都进行加锁这时别的线程就无法修改同一个数据了。 乐观锁虽然会造成数据冲突但是效率高而悲观锁避免了数据冲突却降低了效率。因此在选择使用乐观锁还是悲观锁时需要估计数据冲突的概率冲突概率小就使用乐观锁反之使用悲观锁。 互斥锁和读写锁 互斥锁是一种独占锁同一时间只允许一个线程访问该对象无论读写而读写锁则区分读者和写者同一时间内只允许一个写者但是允许多个读者同时读对象。synchronized是一种互斥锁读写不分开。 Java 标准库提供了 ReentrantReadWriteLock 类实现了读写锁 //读写锁的使用 public class ThreadDemo {private static ReentrantReadWriteLock lock new ReentrantReadWriteLock();//读写锁public static void read() {lock.readLock().lock();//读加锁try {System.out.println(Thread.currentThread().getName() 读操作);Thread.sleep(1000);System.out.println(Thread.currentThread().getName() 读取完毕);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.readLock().unlock();//读解锁}}public static void write() {lock.writeLock().lock();//写加锁try {System.out.println(Thread.currentThread().getName() 写操作);Thread.sleep(1000);System.out.println(Thread.currentThread().getName() 写入完毕);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.writeLock().unlock();//写解锁}}public static void main(String[] args) {new Thread(() - write()).start();new Thread(() - read()).start();} } 轻量级锁和重量级锁 当涉及到大量的内核态用户态切换时需要用到重量级锁当涉及到很少的内核态操作而大多是用户态操作时往往只用到轻量级锁。轻量级锁更加高效往往在加锁解锁频繁情况下使用重量级锁的操作成本较高不轻易使用。轻量级锁往往频繁使用因此通常也是乐观锁而重量级锁也往往是悲观锁。 自旋锁和挂起等待锁 当多个对象竞争同一把锁时就会出现加锁失败的情况没有抢到锁的对象因为采取的措施不同而分为自旋锁和挂起等待锁。自旋锁指的是加锁失败时不释放CPU资源而是进入空循环直到获取到锁才会退出循环挂起等待锁则在加锁失败时释放CPU资源等到锁释放后再去竞争锁。 自旋锁是一种极其耗费CPU资源的手段但在某些情况下却不得不使用。 自旋锁伪代码 while (竞争锁 失败) {}公平锁和非公平锁 公平锁指的是遵循“先来后到”原则竞争锁失败的对象有顺序地进入等待队列释放锁后再按顺序获取锁非公平锁则不遵循这个原则竞争锁失败的对象不管先后都处于同一起跑线锁释放后同时竞争锁。 比如说线程A、B、C三个线程A先获取到锁B首先进入等待然后是C。锁释放后如果是公平锁则B获取到锁而如果是非公平锁则B和C同时竞争释放的锁。 可重入锁和不可重入锁 可重入锁指的是同一线程可以重复获取锁而不会发生死锁的现象不可重入锁指的是同一线程不能两次获得同一把锁否则发生死锁现象。 当线程第一次加锁时可以正常加锁第二次加锁时由于线程已被锁只能进入阻塞等待而解除阻塞等待只能先解锁要解锁就要解除阻塞等待这种情况就称为死锁。就好比家钥匙落在车里车钥匙落在家里的情况。 可重入锁的实现逻辑是在加锁前先进行判断识别如果识别到该锁和第一次加锁是同一把锁则不进行加锁。 死锁 一个线程一把锁多次加锁可重入锁不死锁不可重入锁死锁。但是多个线程多把锁可重入锁也会导致死锁现象 假如t1线程拿到lock1t2线程拿到lock2这时t1线程拿不到lock2就只能阻塞等待但同样t2线程也拿不到lock1因此也只能阻塞等待这就发生了死锁。 线程越多锁越多就越容易发生死锁现象。 发生死锁的必要条件 发生死锁有四个必要条件缺一不可分别是互斥条件、请求和保持条件、不剥夺条件和循环等待条件。 互斥条件一个线程拿到一把锁后其他线程不能使用。请求和保持条件线程在阻塞等待时不会放弃已获取的资源。不剥夺条件一个线程在获取锁以后只能自己使用完释放不可被提前抢占。循环等待条件每个线程都在等待获取下一个线程占有的资源。 两个线程发生死锁现象的特点是互不相让你占有了我需要的资源我占有了你需要的资源都想让对方先释放资源。而多个线程发生死锁现象通常会形成循环A需要的资源被B占有B需要的资源被C占有C需要的资源被D占有D需要的资源又被A占有。 为了解决这种情况通常的做法是针对锁进行编号每次加锁按照顺序加 例如上述死锁情况只需要约定第一层加lock1第二层加lock2即可 synchronized锁 synchronized是JVM基于操作系统提供的mutex互斥锁实现的。synchronized既是乐观锁也是悲观锁既是重量级锁也是轻量级锁为轻量级锁时大概率也是自旋锁。synchronized同时也是非公平锁和可重入锁。 synchronized的锁升级 synchronized之所以可以同时是这么多种锁主要在于synchronized的工作流程是基于锁升级实现的 偏向锁加偏向锁也是无锁状态只是一种偏向标记记录了当前线程如果后续不存在锁竞争则处于无锁状态当后续存在锁竞争时可以第一时间加锁。轻量级锁当存在锁竞争时由偏向锁升级为轻量级锁轻量级锁通常也是自旋锁通过CAS指令实现CAS检测更新内存更新成功则加锁成功停止自旋反之继续空转直到更新成功。这里的自旋锁是自适应的如果长时间没有获取到锁也会停止自旋 伪代码实现 public class spinLock { private Thead cur null;//代表当前锁对象没有被持有 public void lock() { //通过CAS判断当前锁对象是否被占有 //this.cur null代表该锁没有被占用可以被获取到 //当前锁对象尝试对Thread.currentThread()加锁 while (!CAS(this.cur, null, Thread.currentThread())) { } } public void unlock() { this.cur null;//置为null代表该锁没有被占用也就是锁被释放 } }重量级锁当锁竞争比较频繁时自旋锁会耗费大量的CPU资源因此轻量级锁会升级为重量级锁重量级锁需要用到内核的mutex锁在内核态判断锁是否被占用没有则加锁成功并切换回用户态反之则加锁失败挂起等待直到锁被释放再重新竞争。JVM实现的synchronized只能发生锁升级目前还不能实现降级一旦锁升级为重量级就不可能再降级为轻量级。 CAS指令 CASCompare and Swap指令指的是一种通过硬件实现并发安全的常用技术,意为“比较和交换”CAS是原子的其实现步骤不可拆分实现原理如下 //address代表需要更新的内存oldValue为旧值newValue为需要更改的新值 boolean CAS(address, oldValue, newValue) { if (address prevValue) {//address意为获取到内存address处存放的值 address newValue; return true; } return false; }注意上述过程是一步完成的不受多线程的抢占式执行影响。 基于CAS指令的原子性通常用来作为实现锁的底层原理以及可以用来进行无锁并发编程。 编译器JVM的其他优化 通过编译器JVM还可以实现synchronized的锁消除和锁粗化。 锁消除 在单线程环境下使用synchronized时并不会真的加锁。Java源码中有很多方法的实现都会提供无锁版本和加锁版本例如StringBulider类和StringBuffer类的区别就在于StringBulider是无锁版本StringBuffer是加锁版本。当我们在单线程使用StringBuffer时就会进行锁消除的优化。 锁粗化 当出现多次加锁时编译器JVM就会进行锁粗化的优化。锁粗化的是锁的粒度。锁的粒度是指锁定资源的细化程度。锁的粒度越大则并发性越低开销越大粒度越小并发性越高开销越小。 虽然锁的粒度越细开销越小。但是频繁加锁解锁的开销有时会更高。比如你妈妈让你去超市买东西A、B、C你有两种方式 方式一、去超市买A回家去超市买B回家去超市买C回家。 方式二、去超市买A、B、C回家。 显然呢方式一是一个非常弱智的做法明明可以一次性做完却非得分成三次吃力不讨好。 编程也同理对于某些操作如果需要频繁的加锁编译器JVM就会优化为只加锁一次执行完所有操作后再解锁。 ReentrantLock锁 Java中虽然synchronized锁已经可以解决开发中的大部分需要加锁的场景但是synchronized锁是一个非公平锁与之相对的Java源码也实现了ReentrantLock来补足这方面的缺点。 ReentrantLock为可重入锁但是可以通过构造方法传入true变成公平锁。 ReentrantLock的用法 lock()获取锁。unlock()释放锁。tryLock()尝试获取锁如果获取成功返回true否则返回false。tryLock(long timeout, TimeUnit unit)在指定时间内尝试获取锁如果获取成功返回true否则返回false。getHoldCount()查询当前线程保持此锁定的个数即调用lock()方法的次数。getQueueLength()返回正等待获取此锁定的线程估计数。isHeldByCurrentThread()查询当前线程是否保持此锁定。isLocked()查询此锁定是否由任意线程保持。代码案例 ReentrantLock lock new ReentrantLock(true); //传入true代表公平锁不写参数默认非公平锁 lock.lock();//加锁 try {//执行代码 } finally {lock.unlock();//解锁 } synchronized与ReentrantLock的区别 底层实现不同synchronized是关键字基于JVM内部实现ReentrantLock是Java的一个类基于Java实现。使用方式不同对象在获取synchronized锁时发生阻塞只能死等而获取ReentrantLock锁可以定义等待的最大时间超时就放弃锁使用synchronized出代码块系统自动释放锁而使用ReentrantLock必须使用lock()加锁并在最后unlock()解锁否则发生死锁。公平性不同synchronized是非公平锁ReentrantLock默认是非公平锁构造时传入true变为公平锁。唤醒机制不同synchronized只能通过wait()和notify()/notifyAll()随机唤醒某个线程或者唤醒全部线程ReentrantLock通过与Condition搭配唤醒线程更加灵活Condition与Lock绑定通过await()方法让线程等待通过signal()方法唤醒一个等待的线程。 //ReentrantLock唤醒 public class ReentrantLock_test {private static final ReentrantLock lockA new ReentrantLock();private static final ReentrantLock lockB new ReentrantLock();private static final Condition conditionA lockA.newCondition();private static final Condition conditionB lockB.newCondition();public static void main(String[] args) throws InterruptedException {lockA.lock();lockB.lock();conditionA.await();//使lockA锁等待conditionB.await();//使lockB锁等待conditionA.signal();//唤醒lockAconditionB.signal();//唤醒lockB} } 没有说哪一种锁就一定优于其他的锁。在不同的情况下需要选择不同的锁synchronized效率更高ReentrantLock使用更灵活具体使用哪一种锁还要根据实际情况判断。
http://www.w-s-a.com/news/614331/

相关文章:

  • 网站被恶意刷流量可以翻外墙的浏览器
  • 网站做直链下载存储解决方案怎么把网站设置为主页面
  • 西安做网站招聘深圳网站见
  • 网站怎么做优化百度能搜索到wordpress 子分类
  • 六安网站建设培训制作网站需要多少时间
  • 电子商务专业网站建设什么软件可以做动画视频网站
  • wordpress 分享主题做网站优化有必要
  • ftp 网站管理电商网站设计图片
  • 惠州免费建站模板营销型旅游网站建设
  • 南宁cms建站wordpress 开启缩略图
  • 网站模板软件网站admin密码
  • 网站信息做参考文献射阳做企业网站多少钱
  • 网站外部优化的4大重点外贸站外推广
  • 宁波网站建设活动德州乐陵德州seo公司
  • 网站网址相对路径如何设置wordpress怎么加快网站打开速度
  • 有没有能帮人快速网站备案的机构网站建设与制作总结
  • 网站不用了怎么办苏州h5模板建站
  • 网站建设制作定制免费网络短剧
  • 建设部建造师强制注销网站h5响应式网站模板下载
  • 蛋糕网站内容规划建设网站需要多少钱济南兴田德润o厉害吗
  • 企业如何建设网站呢做网站的高手
  • 为什么打开网址都是站长工具开发一款网站需要多少钱
  • 做一个网站app需要多少钱分类信息网站建设计划
  • 怎样下载建设部网站建模培训
  • 北流网站建设制作旅游网站开发目的和目标
  • 网站公司怎么做的网站建设论文二稿
  • 网站建设服务商都有哪些html项目答辩
  • 网站上传到万网主机wordpress视频防盗链
  • 西安建设商城类网站广告设计公司文案
  • 如何建设好高校网站麻辣烫配方教授网站怎么做