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

虚拟主机网站建设的几个步骤长沙哪里优化网站

虚拟主机网站建设的几个步骤,长沙哪里优化网站,企业oa系统价格,python制作的网站目录 11.Synchronized本质上是通过什么保证线程安全的#xff1f; 12.Synchronized使得同时只有一个线程可以执行#xff0c;性能比较差#xff0c;有什么提升的方法#xff1f; 13.Synchronized由什么样的缺陷#xff1f;Java Lock是怎么弥补这些缺陷的#xff1f; 1…目录 11.Synchronized本质上是通过什么保证线程安全的 12.Synchronized使得同时只有一个线程可以执行性能比较差有什么提升的方法 13.Synchronized由什么样的缺陷Java Lock是怎么弥补这些缺陷的 14.Synchronized和Lock对比和选择 15.Sychronized在使用时有何注意事项 11.Synchronized本质上是通过什么保证线程安全的 加锁和释放锁的原理 深入JVM看字节码创建如下代码 使用javac 命令进行编译生成.class文件 得到如下信息 关注红色方框里的monitorenter和monitorexit即可。 Monitorenter和Monitorexit指令会让对象在执行使其锁计数器加1或者减1.每一个对象在同一时间只与一个monitor(锁相关联而一个Monitor在同一时间只能被一个线程获得一个对象在尝试获得与这个对象相关联的Monitor锁的所有权的时候monitorenter指令会发生如下3种情况之一 monitor计数器为0意味着目前还没有被获得那这个线程就会立刻获得然后把锁计数器加1一旦1别的线程再想获取就需要等待。 如果这个monitor已经拿到了这个锁的所有权又重入了这把锁那锁计数器就会累加变成2并且随着重入的次数会一直累加。 这把锁已经被别的线程获取了等待锁释放。 monitorexit指令释放对于monitor的所有权释放过程很简单就是讲monitor的计数器减1如果减完以后计数器不是0则代表刚才是重入进来的当前线程还继续持有这把锁的所有权如果计数器变成0则代表当前线程不再拥有该monitor的所有权即释放锁。 下图表现了对象对象监视器同步队列以及执行线程状态之间的关系 该图可以看出任意线程对Object的访问首先要获得Object的监视器如果获取失败该线程就进入同步状态明显呈状态变为BLOCKED当Object的监视器占有者释放后在同步队列中得到线程就会有机会重新获取该监视器。 可重入原理加锁次数计数器 看如下的例子 对应的字节码 上面的SynchronizedDemo中之心个案同步代码块之后紧接着再会去执行一个静态同步方法而这个方法锁的对象依然就这个类对象那么这个正在执行的线程还需要获取该锁吗答案是不必的从上图中就可以看出来执行静态同步方法的时候就只有一条monitorexit指令并没有monitorenter获取锁的指令。这就是锁的重入性即在同一锁程中线程不需要再次获取同一把锁。 Synchronized先天具有重入性。每个对象拥有一个计数器当线程获取该对象锁后计数器就会加1释放锁后就会将计数器减1. 保证可见性的原理内存模型和happensBefore Synchronized的happensbefore规则即监视器锁规则对同一个监视器的解锁happenbefore于该监视器的加锁。 继续来看代码 该代码的happensbefore关系如图所示 在图中每一个箭头连接的两个节点就代表之间的HappenBefore关系黑色的是通过程序顺序规则推导出来红色的为监视器锁规则推导而出线程A释放锁happensBefore线程B加锁蓝色的则是通过程序顺序规则和监视器锁规则推测出来happensBefore关系。现在我们来重点关注2happensBefore5 通过这个关系我们可以得出什么 根据HappensBefore的定义中的一条如果A HappensBefore B则A的执行结果对B可见并且A的执行顺序先于B。线程A先对共享变量A进行加1由2happensbefore 5关系5可知线程A的执行结果对线程B可见即线程B所读取到的a的值为1。 12.Synchronized使得同时只有一个线程可以执行性能比较差有什么提升的方法 简单来说在JVM中monitorenter和monitorexit字节码依赖于底层的操作系统的Mutex Lock来实现的但是由于使用Mutex  Lock需要将当前线程挂起来并从用户态切换到内核态来执行这种切换的代价是非常昂贵的然而在现实中的大部分情况下同步方法是运行在单线程环境无锁竞争环境如果每次都调用Mutex  Lock那么严重的影响程序的性能。不过在Jdk1.6中对所的实现引入了大量的优化如锁粗化Lock Coarsening),锁消除Lock Elimination),轻量级锁Lightweight Locking),偏向锁Biased Locking适应性自旋Adaptive Spining)等技术来减少锁操作的开销。 锁粗化Lock Coarsening):也就是减少不必要的紧连在一起的Unlock,lock操作将多个连续的锁扩展成一个范围更大的锁。 锁消除Lock Elimination):通过运行时JIT编译器的逃逸分析来消除一些没有在当前同步块以外被其他线程共享的数据的锁保护通过逃逸分析也可以在线程本地Stack上进行对象空间的分配同时还可以减少Heap上的垃圾收集开销。 轻量级锁Lightweight  Locking):这种锁实现的背后基于这样一种假设即在真实情况下我们程序中的大部分同步代码一般处于无所竞争状态即单线程执行环境在无锁竞争的情况下完全可以避免调用操作系统层面的重量级互斥锁取而代之的是在monitorenter和monitorexit中只需要依靠一条CAS原子指令就可以完成锁的获取以及释放。当存在锁竞争的情况下执行CAS指令失败的线程将调用操作系统互斥进入到阻塞状态当锁被释放的时候被唤醒。 偏向锁Biased  Locking):是为了在无锁竞争的情况下避免在锁获取过程中执行不必要的CAS原子指令因为CAS原子指令虽然相对于重量级锁来说开销比较下但还是存在非常可观的本地延迟。 适应性自旋Adaptive  Spining):当线程在获取轻量级锁的过程中执行CAS操作失败时在进入与monitor相关联的操作系统重量级锁mutex semaphore)前会进入忙等待Spining)然后再次尝试当尝试一定次数后如果仍然没有成功则调用与monitor关联的semaphore(即互斥锁进入到阻塞状态。 13.Synchronized由什么样的缺陷Java Lock是怎么弥补这些缺陷的 sychronized的缺陷 1.效率低锁的释放情况少只有代码执行完毕或者异常结束才会释放试图获取锁的时候不能设定超时不能终端一个正在使用锁的线程相对而言Lock可以终端和设置超时。 2.不够灵活加锁和释放的时机单一每个所仅有一个单一的条件某个对象相对而言读写锁更加灵活。 3.无法知道是否成功获得锁相对而言Lock可以拿到状态。 Lock解决相应问题 Lock类这里不做过多解释主要看里面的4个方法 1.lock:加锁 2.unlock():解锁 3.tryLock():尝试获取锁返回一个boolean值 4.tryLock(long,TimeUnit):尝试获取锁可以设置超时 Synchronized只有锁只与一个条件是否获取锁相关联不灵活后来Condition与Lock的结合解决了这个问题。 多线程竞争一个锁时其余未得到锁的线程只能不停地尝试获得锁而不能中断。高并发的情况下会导致性能下降。ReentrantLock的lockInterruptibly方法可以优先考虑相应终端。一个线程等待时间过长他可以中断自己然后ReentrantLock相应这个中断不再让这个线程继续等待。有了这个机制使用ReentrantLock时就不会像synchronized那样产生死锁了。 14.Synchronized和Lock对比和选择 存在层次上 synchronized:Java关键字在jvm层面上 Lock:是一个接口 锁的释放 synchronized:1.以获取锁的线程执行完同步代码释放锁2.线程执行发生异常jvm会让线程释放锁 Lock在finally中必须释放锁不然容易造成线程死锁。 锁的获取 synchronized:假设A线程获得锁B线程等待。如果A线程阻塞B线程会一直等待。 Lock分情况而定Lock有多个锁获取方式大致就是可以尝试获得锁线程可以不用一直等待可以通过tryLock判断有没有锁 锁的释放死锁产生 sychronized:在发生异常时候会自动释放占有的锁因此不会出现死锁 Lock发生异常时候不会主动释放占有锁必须手动unlock来释放锁可能引起死锁的发生 锁的状态 synchronized:无法判断 Lock可以判断 锁的类型 synchronized:可重入  不可中断  非公平 Lock可重入  可中断  可公平两者皆可 性能 synchronized:少量同步 Lock大量同步 Lock可以提高多个线程进行读操作的效率。可以通过readwritelock实现读写分离 在资源竞争不是很激烈的情况下Synchronized的性能要优于ReentrantLock但是在资源竞争很激烈的情况下Synchronized的性能会下降几十倍但是ReentrantLock的性能能够维持常态 ReentrantLock提供了多样化的同步比如有时间限制的同步可以被Interrupt的同步synchronized的同步是不能Interrupt的等。在资源竞争不激烈的情形下性那你稍微比synchronized差点点。但是当同步非常激烈的时候synchronized的性能一下子能下降好几十倍。而ReentrantLock却还能维持常态。 调度 synchronizes:使用Object对象本身的wait,notify,notifyAll调度机制 Lock可以使用Condition进行线程之间的调度 用法 synchronized:在需要同步的对象中加入此控制 sychronized可以加载方法上也可以加在特定代码块中括号中表示需要锁的对象。 Lock一般使用ReentrantLock类作为锁。在加锁和解锁处需要通过lock()和unlock()显式指出。所以一般会在finally块中写unlock以防死锁。 底层实现 synchronized底层使用指令码方式来控制锁的映射成字节码指令就是增加两个指令monitorenter和monitorexit。当线程执行遇到monitorenter指令时会尝试获取内置锁如果获取锁则锁计数器加1如果没有获取锁则阻塞;当遇到monitorexit指令时锁计数器减1如果计数器为0则释放锁。 Lock底层是CAS乐观锁依赖AbstractQueuedSynchronized类把所有的请求线程构成一个CLH队列。而对该队列的操作均通过LockFreeCAS操作。 15.Sychronized在使用时有何注意事项 锁对象不能为空因为锁的信息都保存在对象头里 作用域不宜过大影响程序执行的速度控制范围过大编写代码也容易出错。 避免死锁 在能选择的情况下既不要Lock也不要Synchronized关键字用java.util.concurrent包中各种各样的类如果不用该包下的类在满足业务情况下可以使用synchronized关键因为代码量少避免出错。
http://www.zqtcl.cn/news/116895/

相关文章:

  • 网站建设小知识郑州网站建设找伟置
  • 苏中建设官方网站旅游做攻略用什么网站好
  • 信息门户网站制作wordpress改商城
  • 企业类网站有哪些甘肃省和住房建设厅网站
  • 嘉兴市住房和城乡建设局网站wordpress nodejs版本
  • 做网站 百度推广深圳外贸招聘
  • 网站留言板功能网站建设 核对流程
  • WordPress输出当前网址郑州官网seo厂家
  • c 网站开发框架wordpress建站的教程
  • 营销 推广 网站王烨演的电视剧
  • 阳泉营销型网站建设网站360做的标记如何取消
  • win7 iis asp网站配置文件注册建设网站的公司网站
  • 品牌网站建设预算网站制作过程内容
  • 石河子建设网站网站开发参考资料
  • 网站开发招标参数wordpress个性化友情链接页面
  • 建设企业网站有哪些wordpress进入中国市场
  • 大学社团网站建设虚拟主机如何做网站
  • 销售的产品是帮别人做网站电脑搭建网站
  • h5商城网站是什么莆田网站建设技术托管
  • 优惠券怎么做自己的网站英文网站怎么设计
  • 做网站怎么样才能排在首页做微网站的公司哪家好呢
  • 分析网站外链分析工具wordpress同步简书
  • 电子商务网站案例分析互动游戏制作软件
  • 网站做子域名做美团旅游网站多少钱
  • php做网站架构图开家做网站公司有哪些
  • 专门做ppt会员网站鄞州网站制作
  • 企业网站开发视频请简述网站建设流程图
  • 做网站 做手机app要学什么软件网站在哪里购买
  • 老罗做的网站赣州建设部网站
  • 四川建设主管部门网站盘搜搜