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

网站视频提取软件appaso优化排名推广

网站视频提取软件app,aso优化排名推广,网站建设添加展示栏,网站域名查企业邮箱一、公平锁与非公平锁1.1 概述公平锁#xff1a;是指多个线程按照申请锁的顺序来获取锁。非公平锁#xff1a;是指在多线程获取锁的顺序并不是按照申请锁的顺序#xff0c;有可能后申请的线程比先申请的线程优先获取到锁#xff0c;在高并发的情况下#xff0c;有可能造成…一、公平锁与非公平锁1.1 概述公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序有可能后申请的线程比先申请的线程优先获取到锁在高并发的情况下有可能造成优先级反转或者饥饿现象。饥饿现象就是低优先级的线程可能一直拿不到锁而一直处于等待状态。1.2 区别公平锁Threads acquire a fair lock in the order in which they requested it.公平锁就是很公平在并发环境中每个线程在获取锁时会先查看此锁维护的等待队列如果为空或者当前线程是等待队列的第一个就占有锁否则就会加入到等待队列中以后会按照 FIFO 的规则从队列中取到自己。非公平锁a nonfair lock permits barging: threads requesting a lock can jump ahead of the queue of waiting threads if the lockhappens to be available when it is requested.非公平锁比较粗鲁上来就直接尝试占有锁如果尝试失败就再采用类似公平锁那种方式。而且非公平锁比公平锁的吞吐量大。1.3 Java 中的一些公平锁和非公平锁1. java 中的 ReentrantLock默认是非公平锁当参数 fair 为 true 时就是公平锁。1 /**2 * Creates an instance of {code ReentrantLock}.3 * This is equivalent to using {code ReentrantLock(false)}.4 */5 public ReentrantLock() {6 sync new NonfairSync();7 }89 /**10 * Creates an instance of {code ReentrantLock} with the11 * given fairness policy.12 *13 * param fair {code true} if this lock should use a fair ordering policy14 */15 public ReentrantLock(boolean fair) {16 sync fair ? new FairSync() : new NonfairSync();17 }2. synchronized 也是一种非公平锁。二、可重入锁与不可重入锁2.1 概述可重入锁(也叫做递归锁)指的是同一线程外层函数获得锁之后内层递归函数仍然能获取该锁的代码在同一个线程在外层方法获取锁的时候在进入内层方法会自动获取锁也就是说线程可以进入任何一个它已经拥有的锁所同步着的代码块。可重入锁最大的作用就是避免死锁。不可重入锁即若当前线程执行某个方法已经获取了该锁那么在方法中尝试再次获取锁时就会获取不到被阻塞。2.2 java 中的可重入锁2.2.1 synchronized 锁1 class Phone {2 public synchronized void sendSMS() {3 System.out.println(Thread.currentThread().getName() send SMS...);4 sendEmail();5 }67 public synchronized void sendEmail() {8 System.out.println(Thread.currentThread().getName() send email...);9 }10 }1112 public class ReentrantLockDemo {1314 public static void main(String[] args) {15 Phone phone new Phone();1617 new Thread(() - {18 phone.sendSMS();19 }, Thread1).start();2021 new Thread(() - {22 phone.sendSMS();23 }, Thread2).start();24 }25 }2.2.2 ReentrantLock1 class Phone implements Runnable {2 Lock lock new ReentrantLock();34 Override5 public void run() {6 get();7 }89 public void get() {10 lock.lock();11 try {12 System.out.println(Thread.currentThread().getName() get method...);13 set();14 } finally {15 lock.unlock();16 }17 }1819 public void set() {20 lock.lock();21 try {22 System.out.println(Thread.currentThread().getName() set method...);23 } finally {24 lock.unlock();25 }26 }27 }2829 public class ReentrantLockDemo {3031 public static void main(String[] args) {32 Phone phone new Phone();3334 Thread thread3 new Thread(phone, Thread3);35 Thread thread4 new Thread(phone, Thread4);36 thread3.start();37 thread4.start();38 }39 }2.3 面试题使用 ReentrantLock 时如果加入两层锁呢程序是直接报编译错误还是正常运行正常运行的话能得到预期的结果吗1 class Phone implements Runnable {23 // ...45 public void get() {6 lock.lock();7 lock.lock();8 try {9 System.out.println(Thread.currentThread().getName() get method...);10 set();11 } finally {12 lock.unlock();13 lock.unlock();14 }15 }1617 // ...18 }当缺少 unlock() 时(也就是lock 和 unlock不是一一对应lock 比 unlock 多 )程序不会报编译错误但得不到预期的结果从下面可以看出程序一直处于运行的状态当缺少 lock() 时(也就是unlock 比 lock 多 )此时程序也不会报编译错误控制台也输出了结果但是抛出了 IllegalMonitorStateException 异常。三、自旋锁3.1 概述自旋锁是指尝试获取锁的线程不会立即阻塞而是采用循环的方式去尝试获取锁这样的好处是减少线程上下文切换的消耗缺点是循环会消耗CPU。3.2 java 中的自旋锁1 // Unsafe.java2 public final int getAndAddInt(Object var1, long var2, int var4) {3 int var5;4 do {5 var5 this.getIntVolatile(var1, var2);6 } while(!this.compareAndSwapInt(var1, var2, var5, var5 var4));78 return var5;9 }3.3 手写一个自旋锁1 public class SpinLockDemo {23 AtomicReference atomicReference new AtomicReference();45 public void myLock() {6 Thread thread Thread.currentThread();7 System.out.println(thread.getName() come in...);8 while (!atomicReference.compareAndSet(null, thread)) {910 }11 }1213 public void myUnLock() {14 Thread thread Thread.currentThread();15 atomicReference.compareAndSet(thread, null);16 System.out.println(thread.getName() come out...);17 }1819 public static void main(String[] args) {2021 SpinLockDemo spinLockDemo new SpinLockDemo();2223 new Thread(() - {24 spinLockDemo.myLock();25 try {26 TimeUnit.SECONDS.sleep(5);27 } catch (InterruptedException e) {28 e.printStackTrace();29 }30 spinLockDemo.myUnLock();31 }, Thread1).start();3233 try {34 TimeUnit.SECONDS.sleep(1);35 } catch (InterruptedException e) {36 e.printStackTrace();37 }3839 new Thread(() - {40 spinLockDemo.myLock();41 try {42 TimeUnit.SECONDS.sleep(1);43 } catch (InterruptedException e) {44 e.printStackTrace();45 }46 spinLockDemo.myUnLock();47 }, Thread2).start();48 }49 }四、写锁(独占锁)、读锁(共享锁)和互斥锁4.1 概述独占锁指该锁一次只能被一个线程所持有。对 ReentrantLock 和 Synchronized 而言都是独占锁。共享锁指该锁可被多个线程所持有。对 ReentrantReadWriteLock 其读锁是共享锁其写锁是独占锁。读锁的共享锁可保证并发读是非常高效的读写写读写写的过程是互斥的。4.2 示例(模拟缓存)4.2.1 加锁前数据写入的时候被打断1 class MyCache {23 private volatile Map map new HashMap();45 public void put(String key, Object value) {6 System.out.println(Thread.currentThread().getName() 正在写入 key);7 try {8 TimeUnit.MILLISECONDS.sleep(300);9 } catch (InterruptedException e) {10 e.printStackTrace();11 }12 map.put(key, value);13 System.out.println(Thread.currentThread().getName() 写入完成);14 }1516 public void get(String key) {17 System.out.println(Thread.currentThread().getName() 正在读取);18 try {19 TimeUnit.MILLISECONDS.sleep(300);20 } catch (InterruptedException e) {21 e.printStackTrace();22 }23 Object result map.get(key);24 System.out.println(Thread.currentThread().getName() 读取完成 result);25 }26 }2728 public class ReadWriteLockDemo {2930 public static void main(String[] args) {31 MyCache myCache new MyCache();3233 for (int i 1; i 5; i) {34 final int temp i;35 new Thread(() - {36 myCache.put(temp , temp );37 }, String.valueOf(i)).start();38 }3940 for (int i 1; i 5; i) {41 final int temp i;42 new Thread(() - {43 myCache.get(temp );44 }, String.valueOf(i)).start();45 }46 }47 }4.2.2 加锁后写入时正常不会中断读取时可以共享锁。1 class MyCache {23 private volatile Map map new HashMap();4 private ReentrantReadWriteLock rwLock new ReentrantReadWriteLock();56 public void put(String key, Object value) {7 rwLock.writeLock().lock();8 try {9 System.out.println(Thread.currentThread().getName() 正在写入 key);10 try {11 TimeUnit.MILLISECONDS.sleep(300);12 } catch (InterruptedException e) {13 e.printStackTrace();14 }15 map.put(key, value);16 System.out.println(Thread.currentThread().getName() 写入完成);17 } catch (Exception e) {18 e.printStackTrace();19 } finally {20 rwLock.writeLock().unlock();21 }22 }2324 public void get(String key) {25 rwLock.readLock().lock();26 try {27 System.out.println(Thread.currentThread().getName() 正在读取);28 try {29 TimeUnit.MILLISECONDS.sleep(300);30 } catch (InterruptedException e) {31 e.printStackTrace();32 }33 Object result map.get(key);34 System.out.println(Thread.currentThread().getName() 读取完成 result);35 } catch (Exception e) {36 e.printStackTrace();37 } finally {38 rwLock.readLock().unlock();39 }40 }41 }
http://www.sadfv.cn/news/293310/

相关文章:

  • 美食网站建设策划书正规的网站制作开发
  • 岳阳网站开发商城红色网站建设的作用和意义
  • 青岛网站定制开发局域网做网站
  • dede 网站改宽屏代码调兵山网站
  • 网站可以不备案吗怎么样做网站赚钱吗
  • 网站建设app手机下载关键词排名点击软件怎样
  • 深圳营销型网站建站电商平台介绍
  • 做网站如何用代码把字体变大网站建设的市场情况
  • wordpress样式乱了seo搜索引擎优化试题
  • 网站怎么做rss宣传片拍摄手法
  • 心海建站班级网站建设
  • 酷炫网站首页抖音推广费用标准
  • php网站开发实用技术练习题广州活动策划公司十大排行榜
  • 图片转链接生成器网站农村建设网站的重要性
  • 网站上的3d怎么做的wordpress写代码插件吗
  • 网站pr怎么提升成功网络营销案例
  • 建网站是自己做还是用CMS班级优化大师使用指南
  • 宁波做网站公司宣传片制作公司有哪些公司
  • 把网站放到服务器国外个人网站域名注册
  • 公司网站乱码网络公司给别人做网站的cms是买的授权么
  • 网站怎么上传项目网手游
  • 电脑上如何做课程视频网站一个优秀的网站
  • 网站建设服务哪家有搜狗推广
  • 哪些网站做京东的团购张家港网站建设门店
  • cute模板wordpress优化大师网页版
  • 网站开发前端兼职响应式网站代理
  • 安康企业网站建设价格网址浏览器
  • 网站登录慢网页制作报价模板
  • 济南网站建设多少费用怎样建立自己的微信公众号
  • 室内设计图网站有哪些廊坊视频优化效果