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

用dw做的网站容易变形单片机和做网站

用dw做的网站容易变形,单片机和做网站,台州网站建设惠店科技,纯静态网站怎样作者主页#xff1a; #x1f517;进朱者赤的博客 精选专栏#xff1a;#x1f517;经典算法 作者简介#xff1a;阿里非典型程序员一枚 #xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法#xff08;公众号同名#xff09; ❤️觉得文章还… 作者主页 进朱者赤的博客 精选专栏经典算法 作者简介阿里非典型程序员一枚 记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法公众号同名 ❤️觉得文章还不错的话欢迎大家点赞➕收藏⭐️➕评论支持博主记得点个大大的关注持续更新 ————————————————- 引言 在JDK1.5之后Java还提供了Lock同步锁。本文将探索Lock的使用优化 Lock锁简介 基本特点 Lock锁的基本操作通常基于乐观锁实现尽管在某些情况下如阻塞时它也可能采用悲观锁的策略。通过对比图我们可以清晰地看到两种同步锁的基本特点。 Lock同步锁与Synchronized的比较 在Java中同步锁机制是确保多线程安全访问共享资源的重要手段。与JVM隐式管理锁的Synchronized相比Lock同步锁以下简称Lock锁提供了更细粒度的控制通过显式地获取和释放锁为开发者提供了更大的灵活性。 一、基本特点 Lock锁的基本操作通常基于乐观锁实现尽管在某些情况下如阻塞时它也可能采用悲观锁的策略。通过对比图我们可以清晰地看到两种同步锁的基本特点。 性能对比 在并发量不高、竞争不激烈的情况下Synchronized由于分级锁的优化性能上与Lock锁相近。然而在高负载、高并发场景下由于Synchronized可能会升级到重量级锁其性能稳定性不如Lock锁。通过性能测试我们可以更直观地了解两者的性能差异。 通过以上数据我们可以发现Lock锁的性能相对来说更加稳定。 Lock锁的实现原理 Lock锁是基于Java实现的接口常见的实现类有ReentrantLock和ReentrantReadWriteLockRRW。这些实现类都依赖于AbstractQueuedSynchronizerAQS类AQS内部包含一个基于链表实现的等待队列CLH队列和一个用于表示加锁状态的state变量。 获取锁 下面是获取锁的流程图 优化方式 虽然Lock锁的性能稳定但也并不是所有的场景下都默认使用ReentrantLock独占锁来实现线程同步。 我们知道对于同一份数据进行读写如果一个线程在读数据而另一个线程在写数据那么读到的数据和最终的数据就会不一致如果一个线程在写数据而另一个线程也在写数据那么线程前后看到的数据也会不一致。这个时候我们可以在读写方法中加入互斥锁来保证任何时候只能有一个线程进行读或写操作。 在大部分业务场景中读业务操作要远远大于写业务操作。而在多线程编程中读操作并不会修改共享资源的数据如果多个线程仅仅是读取共享资源那么这种情况下其实没有必要对资源进行加锁。如果使用互斥锁反倒会影响业务的并发性能那么在这种场景下有没有什么办法可以优化下锁的实现方式呢 1. 读写锁ReentrantReadWriteLock 针对这种读多写少的场景Java提供了另外一个实现Lock接口的读写锁RRW。我们已知ReentrantLock是一个独占锁同一时间只允许一个线程访问而RRW允许多个读线程同时访问但不允许写线程和读线程、写线程和写线程同时访问。读写锁内部维护了两个锁一个是用于读操作的ReadLock一个是用于写操作的WriteLock。 那读写锁又是如何实现锁分离来保证共享资源的原子性呢 RRW也是基于AQS实现的它的自定义同步器继承AQS需要在同步状态state上维护多个读线程和一个写线程的状态该状态的设计成为实现读写锁的关键。RRW很好地使用了高低位来实现一个整型控制两种状态的功能读写锁将变量切分成了两个部分高16位表示读低16位表示写。 获取写锁 一个线程尝试获取写锁时会先判断同步状态state是否为0。如果state等于0说明暂时没有其它线程获取锁如果state不等于0则说明有其它线程获取了锁。 此时再判断同步状态state的低16位w是否为0如果w为0则说明其它线程获取了读锁此时进入CLH队列进行阻塞等待如果w不为0则说明其它线程获取了写锁此时要判断获取了写锁的是不是当前线程若不是就进入CLH队列进行阻塞等待若是就应该判断当前线程获取写锁是否超过了最大次数若超过抛异常反之更新同步状态。 获取读锁 一个线程尝试获取读锁时同样会先判断同步状态state是否为0。如果state等于0说明暂时没有其它线程获取锁此时判断是否需要阻塞如果需要阻塞则进入CLH队列进行阻塞等待如果不需要阻塞则CAS更新同步状态为读状态。 如果state不等于0会判断同步状态低16位如果存在写锁则获取读锁失败进入CLH阻塞队列反之判断当前线程是否应该被阻塞如果不应该阻塞则尝试CAS同步状态获取成功更新同步锁为读状态。 举例说明 下面我们通过一个求平方的例子来感受下RRW的实现代码如下 public class TestRTTLock {private double x, y;private ReentrantReadWriteLock lock new ReentrantReadWriteLock();// 读锁private Lock readLock lock.readLock();// 写锁private Lock writeLock lock.writeLock();public double read() {//获取读锁readLock.lock();try {return Math.sqrt(x * x y * y);} finally {//释放读锁readLock.unlock();}}public void move(double deltaX, double deltaY) {//获取写锁writeLock.lock();try {x deltaX;y deltaY;} finally {//释放写锁writeLock.unlock();}}} 2.读写锁再优化之StampedLock RRW被很好地应用在了读大于写的并发场景中然而RRW在性能上还有可提升的空间。在读取很多、写入很少的情况下RRW会使写入线程遭遇饥饿Starvation问题也就是说写入线程会因迟迟无法竞争到锁而一直处于等待状态。 在JDK1.8中Java提供了StampedLock类解决了这个问题。StampedLock不是基于AQS实现的但实现的原理和AQS是一样的都是基于队列和锁状态实现的。与RRW不一样的是StampedLock控制锁有三种模式: 写、悲观读以及乐观读并且StampedLock在获取锁时会返回一个票据stamp获取的stamp除了在释放锁时需要校验在乐观读模式下stamp还会作为读取共享资源后的二次校验后面我会讲解stamp的工作原理。 我们先通过一个官方的例子来了解下StampedLock是如何使用的代码如下 public class Point {private double x, y;private final StampedLock s1 new StampedLock();void move(double deltaX, double deltaY) {//获取写锁long stamp s1.writeLock();try {x deltaX;y deltaY;} finally {//释放写锁s1.unlockWrite(stamp);}}double distanceFormOrigin() {//乐观读操作long stamp s1.tryOptimisticRead(); //拷贝变量double currentX x, currentY y;//判断读期间是否有写操作if (!s1.validate(stamp)) {//升级为悲观读stamp s1.readLock();try {currentX x;currentY y;} finally {s1.unlockRead(stamp);}}return Math.sqrt(currentX * currentX currentY * currentY);} } 我们可以发现一个写线程获取写锁的过程中首先是通过WriteLock获取一个票据stampWriteLock是一个独占锁同时只有一个线程可以获取该锁当一个线程获取该锁后其它请求的线程必须等待当没有线程持有读锁或者写锁的时候才可以获取到该锁。请求该锁成功后会返回一个stamp票据变量用来表示该锁的版本当释放该锁的时候需要unlockWrite并传递参数stamp。 接下来就是一个读线程获取锁的过程。首先线程会通过乐观锁tryOptimisticRead操作获取票据stamp 如果当前没有线程持有写锁则返回一个非0的stamp版本信息。线程获取该stamp后将会拷贝一份共享资源到方法栈在这之前具体的操作都是基于方法栈的拷贝数据。 之后方法还需要调用validate验证之前调用tryOptimisticRead返回的stamp在当前是否有其它线程持有了写锁如果是那么validate会返回0升级为悲观锁否则就可以使用该stamp版本的锁对数据进行操作。 相比于RRWStampedLock获取读锁只是使用与或操作进行检验不涉及CAS操作即使第一次乐观锁获取失败也会马上升级至悲观锁这样就可以避免一直进行CAS操作带来的CPU占用性能的问题因此StampedLock的效率更高。 总结 总结 在并发编程中Synchronized和Lock等同步机制在存在锁竞争时会导致线程阻塞和频繁切换影响性能。为了优化性能关键在于降低锁竞争。 Synchronized可通过减小锁粒度和减少锁占用时间来降低竞争。而Lock如ReentrantReadWriteLock和StampedLock通过读写锁分离和多种锁模式进一步降低锁竞争提高并发性能。 开发者应根据应用场景选择合适的锁机制和策略来优化性能。 欢迎一键三连(关注点赞收藏)技术的路上一起加油代码改变世界 关于我阿里非典型程序员一枚 记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法公众号同名回复暗号更能获取学习秘籍和书籍等 —⬇️欢迎关注下面的公众号进朱者赤认识不一样的技术人。⬇️—
http://www.hkea.cn/news/14280495/

相关文章:

  • 南京公司网站建立万峰科技著.asp.net网站开发四酷全书电子工业出版社
  • 网络型网站分为网站发布方式 提高
  • 网站的推广费用东莞建设网住房保障专栏20批公示栏
  • 甘肃住房城乡建设厅网站集团网站建设特点互联网课堂
  • 怎样做有趣的视频网站免费网址大全
  • 昆明微网站制作wordpress显示全部标签
  • 国外网站设计欣赏分析六安市网站制作
  • 网站开发写好了怎么发布有机大米网站建设方案
  • 公司网站自己创建辽源市住房和城乡建设局网站
  • 移动网站开发与维护有专门做网站的吗
  • 制作营销网站模板汕头新闻
  • 前端搜索网站引擎怎么做7zwd一起做网店官网
  • 深圳企业网站建设公司排名友山建站优化
  • 数据统计网站设计网页要多少钱
  • 学校网站建设项目可行性分析报告企业新闻稿发布平台
  • 贵州省城乡与住房建设部网站商家做小程序怎么做
  • dw个人网站设计模板免费北京宣传片制作公司
  • 淄博网站关键词优化wordpress调用新版媒体库
  • 容桂网站设计制作重庆网站排名提升
  • 建设银行官方网站登录网址房地产网站建设需求说明书
  • 专做畜牧招聘网站的建设摩托车官网110
  • 专业做医院网站建设网站自己怎么建设
  • 网站建设服务采购方案模板下载做空包网站
  • 网站建设的好不好定制网站建设的释义
  • 广州 seo的网站电商名字创意名称
  • 珠海网站外包怎么做降落伞制作方法
  • 江西省建设厅业绩网站哈尔滨报刊零售店地址
  • 婚恋网站制作公司部门聚餐计入什么科目
  • 建设部建设厅报考网站网站数据库要多大
  • 有什么做设计的兼职网站wordpress seo 优化