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

外贸网站平台哪个好wordpress怎么做下载页

外贸网站平台哪个好,wordpress怎么做下载页,太原制作网站企业,中国免费域名注册平台转载自 一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候#xff0c;我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁#xff0c;一种是关键字#xff1a;synchronized#xff0c;一种是concurrent包下的lock锁。syn…转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁一种是关键字synchronized一种是concurrent包下的lock锁。synchronized是java底层支持的而concurrent包则是jdk实现。关于synchronized的原理可以阅读再有人问你synchronized是什么就把这篇文章发给他。 在这里我会用尽可能少的代码尽可能轻松的文字尽可能多的图来看看lock的原理。 我们以ReentrantLock为例做分析其他原理类似。 我把这个过程比喻成一个做菜的过程有什么菜做法如何 我先列出lock实现过程中的几个关键词计数值、双向链表、CAS自旋 使用例子 import java.util.concurrent.locks.ReentrantLock;public class App {public static void main(String[] args) throws Exception {final int[] counter  {0};ReentrantLock lock  new ReentrantLock();for (int i 0; i  50; i){new Thread(new Runnable() {Overridepublic void run() {lock.lock();try {int a  counter[0];counter[0]  a  1;}finally {lock.unlock();}}}).start();}// 主线程休眠等待结果Thread.sleep(5000);System.out.println(counter[0]);} }在这个例子中开50个线程同时更新counter。分成三块来看看源码初始化、获取锁、释放锁 实现原理 ReentrantLock() 干了啥 /*** Creates an instance of {code ReentrantLock}.* This is equivalent to using {code ReentrantLock(false)}.*/public ReentrantLock() {sync  new NonfairSync();}在lock的构造函数中定义了一个NonFairSync static final class NonfairSync extends Sync NonfairSync 又是继承于Sync abstract static class Sync extends AbstractQueuedSynchronizer一步一步往上找找到了 这个鬼AbstractQueuedSynchronizer简称AQS最后这个鬼又是继承于AbstractOwnableSynchronizer(AOS)AOS主要是保存获取当前锁的线程对象代码不多不再展开。 最后我们可以看到几个主要类的继承关系。 锁的类的继承关系 FairSync 与 NonfairSync的区别在于是不是保证获取锁的公平性因为默认是NonfairSync我们以这个为例了解其背后的原理。 其他几个类代码不多最后的主要代码都是在AQS中我们先看看这个类的主体结构。 AbstractQueuedSynchronizer是个什么 再看看Node是什么 看到这里的同学是不是有种热泪盈眶的感觉这尼玛不就是双向链表么我还记得第一次写这个数据结构的时候发现居然还有这么神奇的一个东西。 最后我们可以发现锁的存储结构就两个东西:双向链表 int类型状态。 需要注意的是他们的变量都被transient和volatile修饰。 一个int值一个双向链表是如何烹饪处理锁这道菜的呢Doug Lea大神就是大神我们接下来看看如何获取锁 lock.lock()怎么获取锁 /*** Acquires the lock.*/ public void lock() {sync.lock(); } 可以看到调用的是NonfairSync.lock() 看到这里我们基本有了一个大概的了解还记得之前AQS中的int类型的state值这里就是通过CAS乐观锁去修改state的值。lock的基本操作还是通过乐观锁来实现的。 获取锁通过CAS那么没有获取到锁等待获取锁是如何实现的我们可以看一下else分支的逻辑acquire方法 public final void acquire(int arg) {if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt(); }这里干了三件事情 tryAcquire会尝试再次通过CAS获取一次锁。 addWaiter将当前线程加入上面锁的双向链表等待队列中 acquireQueued通过自旋判断当前队列节点是否可以获取锁。 addWaiter 添加当前线程到等待链表中 可以看到通过CAS确保能够在线程安全的情况下将当前线程加入到链表的尾部。 enq是个自旋上述逻辑有兴趣的可以翻翻源码。 acquireQueued 自旋CAS尝试获取锁 可以看到当当前线程到头部的时候尝试CAS更新锁状态如果更新成功表示该等待线程获取成功。从头部移除。 每一个线程都在自旋CAS 最后简要概括一下获取锁的一个流程 获取锁流程 lock.unlock() 释放锁 public void unlock() {sync.release(1); }可以看到调用的是NonfairSync.release() 最后有调用了NonfairSync.tryRelease() 基本可以确认释放锁就是对AQS中的状态值State进行修改。同时更新下一个链表中的线程等待节点。 总结 lock的存储结构一个int类型状态值用于锁的状态变更一个双向链表用于存储等待中的线程 lock获取锁的过程本质上是通过CAS来获取状态值修改如果当场没获取到会将该线程放在线程等待链表中。 lock释放锁的过程修改状态值调整等待链表。 可以看到在整个实现过程中lock大量使用CAS自旋。因此根据CAS特性lock建议使用在低锁冲突的情况下。目前java1.6以后官方对synchronized做了大量的锁优化偏向锁、自旋、轻量级锁。因此在非必要的情况下建议使用synchronized做同步操作。
http://www.yutouwan.com/news/344310/

相关文章:

  • 中国建设银行客户端下载官方网站优化公司组织架构
  • 网站 系统概述thinkphp制作网站开发
  • 宿州哪家做网站不做洛阳公司青峰做的企业网站
  • 商品网站建设实验报告软文广告平台
  • 在国内可以做国外的网站吗珠海工商网上登记平台
  • 做播放器电影网站需要多少钱什么是网络营销与直播电商
  • 图书馆建设网站注意点做电子相册的网站
  • 全屏网站 功能天津网站建设渠道
  • 百度搜索网站显示图片做网站有哪些公司好
  • asp网站建设 文献网站开发年度总结工作
  • 360搜索怎么做网站优化WordPress附件空间
  • 学院网站建设的需求分析淮阳城乡建设局网站
  • intitle 律师网站建设的重要性中国十大网络科技公司排名
  • 如何将网址提交到一些权重比较高的网站北京商场几点开门
  • 淘宝联盟链接的网站怎么做的wordpress ownclound
  • 深圳企业建网站公司专业的门户网站建设方案
  • 嘉兴网站备案去哪里国内建站源码
  • 网站社区怎么创建怎么进入wordpress
  • 电商网站 外包WordPress古腾堡插件
  • 酒店网站建设一般考虑哪些因素提交收录网站
  • 工业产品设计网站推荐注册网址怎么注册步骤
  • 网页与网站深圳市住房保障署官网登录
  • 做做网站2023下载谷歌商店下载官网
  • 天猫网站左侧导航用js怎么做策划书案例范文
  • 贵阳网站如何推广南京制作企业网站
  • 格尔木市建设局网站青岛seo推广公司
  • 啥网站都能看的浏览器下载windows清理优化大师
  • 学校网站建设团队宁波公司
  • 自己做网站需要缴费么建筑模板规格
  • 石家庄企业做网站网站建设和软件开发哪个有前途