当前位置: 首页 > 网络应用技术

加深同步的底层原理

时间:2023-03-07 21:46:32 网络应用技术

  请记住,一旦遇到多线程,就可以使用同步学习来学习Java。与我们当时相比,同步是如此神奇和强大。良好药物的线程不舒服。

  ???同步,通常称为:对象锁,专门用于锁定对象(您不需要过多地关心对象的问题,无论如何,您将没有它吗?)。

  ???同步使用互斥的方法来确保最多同时,只有一个线程具有对象锁定。如果您想获得此锁,其他线程将阻止组。

  关键资源:一段时间内仅允许一次访问。也称为独家资源。

  关键领域:流程访问关键资源的代码

  现在您已经了解了同步的用法,让我们谈谈:

  同步语法:

  ?线程安全性:SO称为“线程安全性”是在与共享数据并行执行多个线程的过程中。线程安全码将确保可以通过同步机制正常,正确地执行每个线程,并且不会发生诸如数据污染之类的事故。(例如,当许多方法同时称为多个类对象时,该方法的返回结果是完全相同的,表明该方法是螺纹-SAFE)。

  对象的结构如下:

  缩写为:

  在这里,我们介绍目标标头。

  以32位虚拟机为例。

  我们专注于标记字,其结构是:

  (1)监视原理

  监视器被翻译为监视器或管道。

  每个Java对象都可以与监视器关联。如果它使用同步锁定对象(重量锁定),则该指针将设置在大象头的标记词中。

  监视器对象是每个Java对象的标记字(存储器指针的方向),并且以这种方式获得同步锁定。这就是为什么Java中的任意对象可以用作锁。Notify/NotifyAll/Wait和其他方法使用监视器锁定对象,因此必须在同步代码块中使用它们。

  从JDK5引入了现代操作系统的新操作系统(JDK5没有优化同步关键字,而是在J.U.C中反映出来,因此在此版本的并发软件包中具有更好的性能)。从jdk6开始,现在是时候了,所以你只是,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你就是这样,你只是,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你,你所以,你只是,你只是,你就是这样,所以,你,你,你,你,你,你,你,你只是,你只是开始。调整。除了使用JDK5引入的CAS旋转外,还添加了自适应CAS旋转,锁定,锁定,锁定锁定和轻量级锁的最佳策略。因为此关键字的优化大大改善了性能,因此语义是明确的,语义是明确的,这种关键字是明确的,是该关键字的优化。操作很简单,并且不需要手动关闭操作。因此,建议在允许的情况下尽可能多地使用此关键字,同时,此关键字有优化的空间。

  锁中有四个主要状态。顺序:没有锁定状态,有偏置的锁状态,轻量级锁状态和重量级锁状态。可以将锁从锁升级到轻质锁,然后升级重量级锁。但是,锁的升级是一条路,这意味着它只能从低调升级到高高,并且不会有降级锁。

  在JDK 1.6中,默认情况下,偏置和轻量级锁将打开。您可以通过-XX禁用偏置锁定: - usebiasedlocking。

  CAS是CPU原子指令(CMPXCHG指令),并不会引起如此称呼的数据不一致的问题。

  CAS的全名是Compaare和交换,这是在多线程环境中实现同步函数的机制。

  轻质锁的使用方案是:如果对象有多个线程可以锁定,则锁定时间交错(也就是说,没有人可以竞争),那么您可以使用轻量级的锁定。Eptimize.LightWeightLoxs wabterpare tocks tocks wabter weakeight lox locks是透明的。,即语法或同步。假设有两种方法同步块,并且使用相同的对象锁定。

  SO称为锁定的扩展是允许解锁操作进入重量级锁的解锁操作。

  如果CAS操作在尝试添加轻质锁的过程中无法成功。目前,有一种情况是,还有其他线程可以在此物体中添加轻质锁(竞争性),而轻量级锁变得重量级为重量级。lock。

  当CAS操作失败时,Thread-1将进入阻塞队列。为了减少CPU消耗资源,进一步引入了锁定旋转。如果当前线程成功旋转(即,释放了旋转时锁定锁的线程),那么当前线程可以在没有上下文的情况下获得锁定转变。

  ?自旋 - 旋转将占据CPU时间。单核CPU旋转是浪费,并且多核CPU斑点可以发挥优势。Java 6后,自旋锁定为自适应。例如,该物体的旋转操作刚刚成功,因此人们认为成功旋转的可能性会很高,而且会增加几次。简而言之,不要旋转,更聪明。,您无法控制是否打开旋转功能。

  轻巧的锁类似于隆隆的袋子(小秘密)

  ?在轻巧的锁中,我们可以发现,如果将同一线程重新输入同一对象上的锁,则还需要CAS操作,这是一点点时间 - 令人震惊。

  ?然后Java6开始引入偏置锁以进行进一步的优化。只有第一次使用CAS时,对象的标记字标头设置为有偏见的线程ID。它意味着没有竞争,因此不再需要CAS。(类似于将铭牌挂在门)分析代码,比较轻巧的锁和偏置锁

  ?分析如图所示:

  ?

  对象的头部格式如下:

  ?对象的创建过程:

  ?拒绝偏见

  以下情况将使对象的偏见失败

  ?批处理沉重的偏见

  ?批量的CUG

  在撤销偏置锁的阈值超过40之后,整个类的对象将更改为无偏见

  从JDK1.6开始,同步锁的实现发生了许多更改。JVM引入了相应的优化方法,以提高同步锁的性能。用户模式与锁定竞赛带来的内核状态之间的切换;实际上,通过Java对象的标题中的某些徽标来实现此锁的优化;该对象密切相关。

  ?对象实例分为堆中的三个部分:对象头,实例数据并填充它。对象头还由三个部分组成:

  ?其中,标记单词(IT记录对象,锁和垃圾回收信息,以64位JVM,其长度为64位)。位信息包括以下组件:

  对于同步锁,锁的升级主要是通过锁定标记单词锁定音符以及是否有偏向锁定标记的;连续升级,逐渐发展为幅度锁,并最终成为重量级锁。

  如果是访问此同步方法的另一个线程,实际情况将会发生什么?:偏见的锁将被取消。

  ???

  ???这条路很长,很远,我会要求上下

  苍凉

  最后,不要进入您喜欢的剪辑吃灰烬???

  ?支持我:喜欢?收藏夹点消息?