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

做推文加入视频的网站杭州千锋教育地址

做推文加入视频的网站,杭州千锋教育地址,简述网站一般建设的流程,盐城网站建设科技有限公司上篇铺垫#xff1a;Java中的锁机制#xff1f;#xff08;体系梳理篇#xff09;-CSDN博客 一、sychronized的介绍 sychronized是Java原生的一个同步锁机制#xff0c;可以保证在多线程并发的情况下#xff0c;仅允许一个线程执行加锁的方法和代码块#xff0c;保证了…上篇铺垫Java中的锁机制体系梳理篇-CSDN博客 一、sychronized的介绍 sychronized是Java原生的一个同步锁机制可以保证在多线程并发的情况下仅允许一个线程执行加锁的方法和代码块保证了线程安全。 在Java1.5之前sychronized关键字实现的同步锁底层是一种悲观锁的理念在1.6版本后Java对该关键字进行了优化使得该锁在某些情况下呈现轻量锁的作用这个后面介绍先有个印象 二、sychronized的作用 原子性保证各个线程间的互斥。可见性保证共享变量的可见性就是在加锁的时候仅允许持有锁的线程修改变量在修改结束后该变量的值会同步到内存当中保证其他变量可以访问这个变量的修改。有序性有效解决重排序问题即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作” 对于可见性可能很多人有疑问volatile关键字也是保证共享变量的可见性它和sychronized有什么区别 volatile关键字保证了你对当前变量的修改会直接同步到内存中而sychronized关键字它是先加锁然后修改值释放锁之后才会把值同步到内存中sychronized是有一个加锁的过程保证了原子性而volatile关键字并没有加锁因此它并不具备原子性。 那么很多人可能又想问volatile关键字如何保证线程并发问题 很简单通过CAS来保证在多线程并发情况下仅有一个线程修改volatile修饰的变量。详情请看Java中的锁机制体系梳理篇-CSDN博客 三、Java1.6之后对sychronized关键字的优化了什么 在1.5版本之前sychronized关键字底层是一个互斥锁是一个重量级锁怎么理解呢只要我对当前代码块加锁那么无论我持锁线程是读取值还是修改值其他的线程都必须等待我当前线程释放锁然而在很多情况下大部分都是读操作并不需要如此重量级的线程管控。 因此在Java1.6版本之后Java对sychronized关键字进行了优化。在Java1.6中sychronized并不会直接对锁进行重量级锁的实现而是会根据实际情况一步步将锁升级为重量级锁。我们先了解一下锁的几种状态 无锁 当前线程第一次访问加锁代码块此时代码块还未加锁成为无锁。如何辨别是第一次访问呢在加锁的对象头中又有一个threadid字段用于表示当前代码块是否被加锁。 偏向锁 当前线程第二次访问加锁代码块此时代码块已经被当前线程加了一次锁在读取threadid字段后知道是当前线程在持有锁锁升级为偏向锁。此时会对当前线程直接放行不需要重复申请锁通过这种机制实现了可重入锁也就是当前线程可以重复获取当前锁。 轻量锁 轻量级锁是由偏向锁升级而来当存在第二个线程申请同一个锁对象时偏向锁就会立即升级为轻量级锁。第二个线程会通过一定的自旋循环来获取锁。 重量锁 重量级锁是由轻量级锁进一步升级而来当同一时间有多个线程竞争锁时自旋线程过多锁就会被升级成重量级锁因为自旋线程过多会严重消耗cpu性能。 2.锁消除 消除锁是虚拟机另外一种锁的优化这种优化更彻底在JIT编译时对运行上下文进行扫描去除不可能存在竞争的锁。比如下面代码的method1和method2的执行效率是一样的因为object锁是私有变量不存在所得竞争关系。 3. 锁粗化 锁粗化是虚拟机对另一种极端情况的优化处理通过扩大锁的范围避免反复加锁和释放锁。比如下面method3经过锁粗化优化之后就和method4执行效率一样了。 四、sychronized的底层原理 synchronized 同步代码块的实现是通过 monitorenter 和 monitorexit 指令其中 monitorenter 指令指向同步代码块的开始位置monitorexit 指令则指明同步代码块的结束位置。当执行 monitorenter 指令时线程试图获取锁也就是获取 monitor(monitor对象存在于每个Java对象的对象头中synchronized 锁便是通过这种方式获取锁的也是为什么Java中任意对象可以作为锁的原因) 的持有权。 其内部包含一个计数器当计数器为0则可以成功获取获取后将锁计数器设为1也就是加1。相应的在执行 monitorexit 指令后将锁计数器设为0表明锁被释放。如果获取对象锁失败那当前线程就要阻塞等待直到锁被另外一个线程释放为止。 synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令取得代之的确实是 ACC_SYNCHRONIZED 标识该标识指明了该方法是一个同步方法JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法从而执行相应的同步调用。 五、sychroized为什么是非公平锁 要讨论这个问题我们必须明白什么是公平锁什么是非公平锁 公平锁公平锁是指当锁被当前线程持有其他线程会按照先后顺序排队排在前面的会优先获取锁这就称为公平锁在Java中JUC包下的AQS就可以实现公平锁至于原理我们下篇文章介绍AQS时展开讨论。非公平锁由上面结论我们举反例可以知道非公平锁就是我不管你是否先来谁先抢到锁谁就执行sychronized就是一个非公平锁。 但为什么呢其实很简单在sychronized中有两个池的概念一个是EntryList一个是WaitSetEntryList是一个单链表结构当线程获取锁失败后线程就会被封装称Entry对象然后加入到EntryList中。当某个持有锁线程调用wait()方法线程就会释放锁然后加入到WaitSet中当该线程被唤醒后会加入到EntryList中等待JVM调用。 但JVM并不会按照顺序去调用EntryList中的线程而是随机调用这也就导致了sychronized是一个非公平锁。 至于锁对象头的内容大家请看这篇文章synchronized详解-CSDN博客
http://www.zqtcl.cn/news/638874/

相关文章:

  • 江西网站设计方案网站通栏广告代码
  • 外包网站建设公司网站建设公司的销售好做吗
  • lol做任务领头像网站营销型网站重要特点是?
  • 设计师35岁后的出路嘉兴做网站优化的公司
  • 网站首页包含的内容网站网站注册
  • 企业网站改版建议北京市在建工程项目查询
  • 广州通和通信建设有限公司网站myeclipse怎么做网页
  • 最好的做网站公司有哪些泰安人才网官网登录
  • 怎么用wordpress修改网站源码辽宁省营商环境建设局网站
  • 做网站数据库怎么做wordpress video主题
  • 田园综合体建设网站梧州网站建设有哪些
  • 公司做网站的流程茂名网站建设公司
  • 徐州专业网站建设公司wordpress tag找不到
  • 网站互动推广织梦网站主页代码在后台怎么改
  • 福永自适应网站建设微信小程序功能开发
  • 制作一个动态企业网站狠狠做最新网站
  • 手机建立一个免费网站网页设计师培训方法
  • 广州工信部网站查询wordpress mysql类
  • 销售网站内容设计书籍管理网站建设需求文档
  • 韩国网站如何切换中文域名如何备案教程
  • 网站维护的基本概念二维码生成器使用方法
  • 公司网站建设模块简介搭建自己的网站需要什么
  • 想做个网站怎么做给国外网站做流量
  • 长春建站培训班免备案虚拟空间
  • 做面包的公司网站alexa世界排名查询
  • 网站备案后下一步做什么263邮箱注册
  • 燕郊网站制作廊坊网站制作网站
  • 开网站建设网站如何做excel预览
  • p2p网站建设方案电商企业有哪些
  • 建设农场网站天元建设集团有限公司法定代表人