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

wordpress模板服务器广州seo优化外包公司

wordpress模板服务器,广州seo优化外包公司,软件商店正版下载安装,网站建设建设公司哪家好一、多线程预防和避免线程死锁 如何预防死锁#xff1f; 破坏死锁的产生的必要条件即可#xff1a; 破坏请求与保持条件#xff1a;一次性申请所有的资源。破坏不剥夺条件#xff1a;占用部分资源的线程进一步申请其他资源时#xff0c;如果申请不到#xff0c;可以主动释… 一、多线程预防和避免线程死锁 如何预防死锁 破坏死锁的产生的必要条件即可 破坏请求与保持条件一次性申请所有的资源。破坏不剥夺条件占用部分资源的线程进一步申请其他资源时如果申请不到可以主动释放它占有的资源。破坏循环等待条件靠按序申请资源来预防。按某一顺序申请资源释放资源则反序释放。破坏循环等待条件。 如何避免死锁 避免死锁就是在资源分配时借助于算法比如银行家算法对资源分配进行计算评估使其进入安全状态。 安全状态 指的是系统能够按照某种线程推进顺序P1、P2、P3……Pn来为每个线程分配所需资源直到满足每个线程对资源的最大需求使每个线程都可顺利完成。称 P1、P2、P3.....Pn 序列为安全序列 二、简述CAS CAS的全称是 CompareAndSwap比较与交换 用于实现乐观锁被广泛应用于各大框架中。CAS的思想很简单就是用一个预期值和要更新的变量值进行比较两值相等才会进行更新。 CAS是一个原子操作底层依赖于一条CPU的原子指令。 原子操作 即最小不可拆分的操作也就是说操作一旦开始就不能被打断直到操作完成。 CAS涉及到三个操作数 V要更新的变量值(Var)E预期值(Expected)N拟写入的新值(New) 当且仅当V的值等于E时CAS通过原子方式用新值N来更新V的值。如果不等说明已经有其它线程更新了V则当前线程放弃更新。 举一个简单的例子线程A要修改变量i的值为6i原值为1V1E1N6假设不存在ABA问题。 i与1进行比较如果相等则说明没被其他线程修改可以被设置为6。 i与1进行比较如果不相等则说明被其他线程修改当前线程放弃更新CAS操作失败。 当多个线程同时使用CAS操作一个变量时只有一个会胜出并成功更新其余均会失败但失败的线程并不会被挂起仅是被告知失败并且允许再次尝试当然也允许失败的线程放弃操作。 Java语言并没有直接实现CASCAS相关的实现是通过C内联汇编的形式实现的JNI调用。因此CAS的具体实现和操作系统以及CPU都有关系。 sun.misc包下的Unsafe类提供了compareAndSwapObject、compareAndSwapInt、compareAndSwapLong方法来实现的对Object、int、long类型的CAS操作 /** param 包含要修改field的对象*  param offset    对象中某field的偏移量*  param expected  期望值* param update    更新值*  return true | false**/ public final native boolean compareAndSwapObject(Object o, long offset,  Object expected, Object update);public final native boolean compareAndSwapInt(Object o, long offset, int expected,int update);public final native boolean compareAndSwapLong(Object o, long offset, long expected, long update) 三、乐观锁和悲观锁 什么是乐观锁 乐观锁总是假设最好的情况认为共享资源每次被访问的时候不会出现问题线程可以不停地执行无需加锁也无需等待只是在提交修改的时候去验证对应的资源也就是数据是否被其它线程修改了具体方法可以使用版本号机制或CAS算法。 在Java中java.util.concurrent.atomic包下面的原子变量类比如AtomicInteger、LongAdder就是使用了乐观锁的一种实现方式 CAS 实现的。 // LongAdder 在高并发场景下会比 AtomicInteger 和 AtomicLong 的性能更好// 代价就是会消耗更多的内存空间空间换时间LongAdder sum  new LongAdder();sum.increment(); 高并发的场景下乐观锁相比悲观锁来说不存在锁竞争造成线程阻塞也不会有死锁的问题在性能上往往会更胜一筹。但是如果冲突频繁发生写占比非常多的情况会频繁失败和重试这样同样会非常影响性能导致CPU飙升。 不过大量失败重试的问题也是可以解决的像我们前面提到的 LongAdder以空间换时间的方式就解决了这个问题。 理论上来说 悲观锁通常多用于写比较多的情况多写场景竞争激烈这样可以避免频繁失败和重试影响性能悲观锁的开销是固定的。不过如果乐观锁解决了频繁失败和重试这个问题的话比如LongAdder也是可以考虑使用乐观锁的要视实际情况而定。 乐观锁通常多用于写比较少的情况多读场景竞争较少这样可以避免频繁加锁影响性能。不过乐观锁主要针对的对象是单个共享变量参考java.util.concurrent.atomic包下面的原子变量类。 和数据库乐观锁的区别 JavaCASCAS是底层的原子操作它适用于线程间对内存中的共享资源进行无锁的、低级别的同步。CAS操作通常用于实现高级的并发数据结构如无锁队列、栈等和同步工具如原子类AtomicInteger、AtomicReference等这些结构和工具可以在多线程环境下提供更好的性能和更低的延迟。CAS操作不依赖于外部存储它是在内存级别上保证数据的原子性和一致性。 数据库版本号乐观锁在数据库操作中使用版本号作为乐观锁是一种常见的做法。这通常通过在数据表中增加一个版本号字段来实现。每次更新数据时版本号会递增。在提交更新时应用程序会检查版本号是否自上次读取以来没有变化。如果版本号匹配则执行更新否则表示数据已被其他事务修改需要重新获取数据并重试更新操作。这种机制适用于数据库中的高并发更新操作可以避免因为数据库行锁而导致的性能瓶颈。 什么是悲观锁 悲观锁总是假设最坏的情况认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改)所以每次在获取资源操作的时候都会上锁这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说共享资源每次只给一个线程使用其它线程阻塞用完后再把资源转让给其它线程。 像Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 高并发的场景下激烈的锁竞争会造成线程阻塞大量阻塞线程会导致系统的上下文切换增加系统的性能开销。并且悲观锁还可能会存在死锁问题影响代码的正常运行。 线程池核心参数线程池工作模型 ①、corePoolSize 定义了线程池中的核心线程数量。即使这些线程处于空闲状态它们也不会被回收。这是线程池保持在等待状态下的线程数。 ②、maximumPoolSize 线程池允许的最大线程数量。当工作队列满了之后线程池会创建新线程来处理任务直到线程数达到这个最大值。 ③、keepAliveTime 非核心线程的空闲存活时间。如果线程池中的线程数量超过了corePoolSize那么这些多余的线程在空闲时间超过keepAliveTime时会被终止。 ④、unit keepAliveTime参数的时间单位 TimeUnit.DAYS;天 TimeUnit.HOURS;小时 TimeUnit.MINUTES;分钟 TimeUnit.SECONDS;秒 TimeUnit.MILLISECONDS;毫秒 TimeUnit.MICROSECONDS;微秒 TimeUnit.NANOSECONDS;纳秒 ⑤、workQueue 用于存放待处理任务的阻塞队列。当所有核心线程都忙时新任务会被放在这个队列里等待执行。 ⑥、threadFactory 一个创建新线程的工厂。它用于创建线程池中的线程。可以通过自定义 ThreadFactory 来给线程池中的线程设置有意义的名字或设置优先级等。 ⑦、handler 拒绝策略RejectedExecutionHandler定义了当线程池和工作队列都满了之后对新提交的任务的处理策略。常见的拒绝策略包括抛出异常、直接丢弃、丢弃队列中最老的任务、由提交任务的线程来直接执行任务等。 四、线程池的工作流程 当应用程序提交一个任务时线程池会根据当前线程的状态和参数决定如何处理这个任务。 如果线程池中的核心线程都在忙并且线程池未达到最大线程数新提交的任务会被放入队列中进行等待。 如果任务队列已满且当前线程数量小于最大线程数线程池会创建新的线程来处理任务。 空闲的线程会从任务队列中取出任务来执行当任务执行完毕后线程并不会立即销毁而是继续保持在池中等待下一个任务。 当线程空闲时间超出指定时间且当前线程数量大于核心线程数时线程会被回收。 public class ThreadPoolDemo {public static void main(String[] args) {// 创建一个线程池ExecutorService threadPool  new ThreadPoolExecutor(3, // 核心线程数6, // 最大线程数0, // 线程空闲时间TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue(10), // 等待队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.AbortPolicy() // 拒绝策略);// 模拟 10 个顾客来银行办理业务try {for (int i  1; i  10; i) {final int tempInt  i;threadPool.execute(() - {System.out.println(Thread.currentThread().getName()  \t  办理业务  tempInt);});}} catch (Exception e) {e.printStackTrace();} finally {threadPool.shutdown();}} }注此片可能部分摘自JavaGuide  具体那篇文章链接不记得了从我自己笔记中又拿出来的
http://www.zqtcl.cn/news/223498/

相关文章:

  • 建设工程网站tcwordpress 标题入库
  • 网站开发简直广州网站制作后缀
  • 上海短视频seo优化网站wordpress 构建知识库
  • 做的网站图片不显示2018做网站赚钱不
  • 国内建站平台网站建设是什么科目
  • 响应式个人网站psd建设银行网站联系电话
  • 大型网站开发实战品牌网站建设费用要多少
  • 昆山网站建设昆山html5制作手机端页面
  • 做网站的国标有哪些达州网络推广
  • 站内seo和站外seo区别wordpress演示数据
  • 建设旅游网站财务分析创意设计公司网站
  • 张家港网站优化wordpress调用图片上传
  • 做网站要商标吗房产网站 设计方案
  • 做网站的费用怎么做账客户案例 网站建设
  • 怎么查询网站的备案号城乡建设杂志网站
  • 婚恋网站哪家做的最好北斗导航2022最新版手机版
  • 别墅效果图网站重庆金融公司网站建设
  • 中兴能源建设有限公司网站企业营销策划及推广
  • 外贸英文网站制作WordPress对接微信公众号
  • 推广网站建设花费得多少钱哪些平台可以发布软文
  • wordpress网站检测购物app大全
  • 遵义建设厅官方网站 元丰兰州网站设计有限公司
  • 芜湖做网站的公司排名贵阳好的网站建设公司
  • 网站建设 骏域网站建设专家最有效的15个营销方法
  • 大连品牌官网建站为什么有些网站更新的信息看不到
  • 富阳市网站域名申请好了怎么做网站
  • 做药物分析必须知道的网站网站攻击一般有那些
  • 一般网站做哪些端口映射那个网站做境外自由行便宜
  • 网站的建站过程公司seo是什么意思
  • 胜利油田局域网主页入口seo自学网官网