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

Java详细说明

时间:2023-03-07 12:00:26 网络应用技术

  公平锁定:这意味着多个线程在应用程序锁定的顺序中获取锁定。线程将队列直接进入队列进入队列,队列中的第一个线程可以锁定。类似地排队和餐点,先是先出现。

  非式锁:在多个线程中获得锁的顺序不在应用程序锁定的顺序上。可以优先获得应用程序后应用的螺纹,而不是首先应用的线程。

  公平的锁非常公平。在并发环境中,每个线程将在获得锁时首先检查此锁定维护的等待队列。如果它是空的,或者当前线程是等待队列的第一个,则将拥有锁,否则将是,否则将是。根据FIFO规则,您自己从队列中。

  非fair锁,相对粗鲁,在您上升时尝试直接拥有锁。如果您尝试失败,则将使用与公平锁相似的方式。

  公平锁的优点是等待锁的线不会饿死。

  非挂锁的优点是,吞吐量大于公平锁。

  数据包中的创建可以指定构造函数的类型以获得公平或非锁定锁定,默认值是非fair锁。

  查看,您可以看到有一个继承的内部类,并且大多数添加和释放锁的操作实际上都在中间实现。

  与两种结构方法相比,我们可以看到公平锁和非锁定锁之间的区别

  同步关键字也是一个非flat锁。

  乐观的锁和悲观锁定是一个一般概念,反映了观察线程同步的不同角度。有实际应用与Java和数据库中的此概念相对应。

  内裤锁:更适合操作更频繁的场景。如果出现大量阅读操作,每次阅读时都会执行锁定,这将增加大量锁的开销并减少系统的吞吐量。

  乐观的锁:它更适合通过频繁操作阅读场景。如果发生大量写作操作,数据中发生冲突的可能性将增加。为了确保数据的一致性,需要通过数据连续重新计算应用程序层,以减少系统吞吐量的许多查询操作。

  小锁更适合于强一致性,但是效率相对较低,尤其是并发读数。目的锁适合具有更多阅读和更少冲突的场景。

  乐观锁的常见问题:

  重新输入锁,也称为递归锁,意味着,当在外层方法中获得相同的线程时,输入线程的内层方法将自动获得锁定(先决条件锁定对象可能是同一对象或班级),也不会。因为它已经在之前获得了,因此尚未发布。

  换句话说,线程可以输入它已经拥有的任何代码块。

  重新输入锁的最大作用是避免在一定程度上避免死锁,即典型的可启用锁。

  在上面的代码中,类中的两种方法通过构建锁同步进行修改,doothers()方法在dosomething()方法中调用。调用DoOsher()时可以直接获取当前对象的锁定,然后输入Doothers()进行操作。

  如果它是不可替代的锁,则当前线程需要在Doothers())需要执行Dosomething()执行时获得当前对象的锁定。实际上,对象锁已由当前线固定,无法释放。因此,此时将有死锁。

  Self -Spin锁定意味着尝试获取锁定的线程不会立即阻止,而是使用一个周期来尝试获取锁。这个优势是减少线程的消耗。

  缺点:

  优势:

  上面写的旋转锁,仔细分析它,可以看出它不支持recincome,也就是说,当第一次获得线程时,锁定在锁定之前将重新计入,并且第二次将是第二次。不得成功获得。因为它不满意CAS,第二次将进入周期等待,如果是复发锁,则第二次应该成功。

  此外,即使第二次可以第二次获得锁,第一次释放锁时,第二次获得的锁将被释放,这是不合理的。

  为了实现重新锁定锁,我们需要引入一个计数器来记录螺纹的数量以获取锁。

  独家锁:这意味着锁一次只能由一个线程持有,这是重新输入和同步的独家锁

  共享锁:指锁可以由多个线程保存

  对于ReentrantreadWritelock而言,它是一个共享锁,其写作锁定是一个独家锁。

  阅读锁的共同锁可以确保并发阅读非常有效,并且阅读,写作,写作和写作的过程是相互排斥的。

  这四个锁指的是锁状态,专门用于同步。在引入这四种类型的锁状态之前,您需要引入一些其他知识。

  首先,为什么同步可以实现线程同步?

  在回答这个问题之前,我们需要了解两个重要概念:“ Java对象”和“ Monitor”。

  没有锁

  没有锁不会锁定资源。所有线程都可以访问和修改相同的资源,但同时,只有一个线程可以成功修改它。

  无锁的特征是修改周期内的操作,线程将不断尝试修改和共享资源。如果没有冲突,修改成功并退出,否则将继续尝试。如果有多个线程修改相同的值,将有一个可以成功修改的线程,而修改失败的其他线程将继续测试,直到修改成功。CAS原理和应用程序上面介绍的是无锁的实现。被锁完全取代,但是在某些情况下没有锁的性能很高。

  有偏见的锁

  偏置锁意味着线程已访问了同步代码,因此线程将自动获取锁定以降低获得锁定的成本。

  在大多数情况下,锁总是从同一条线中获得,并且没有多线程竞争,因此发生有偏见的锁。目标是在只有一个线程执行同步代码块时提高性能。

  当线程访问同步代码块并获取锁定时,它将将锁定偏置的线程ID存储在标记单词中。线程进入并退出同步块时,它将不再锁定并通过CAS操作解锁。相反,它是要检测当前线程中的偏置锁是否存储在标记单词中。偏置锁的引入是最大程度地减少不必要的轻量级锁定执行路径,而无需多线程竞争,因为轻量级锁的采集和发布取决于多个多个多个多个多个多个。Cas Atoms按顺序进行,偏置锁只需要替换由ThreadIdjust取代的螺纹ID,一次就依靠CAS ATOM指令。

  只有当偏置锁试图在其他线程中竞争锁时,持有偏置锁的线程才会释放锁,线程将不会主动释放偏置锁。有偏置锁的撤销需要等待全局安全性点(在此时间点未执行任何字节代码)。它将首先用偏置的锁悬挂线,以确定锁定对象是否锁定。废除锁定后,将锁定恢复到无锁的状态(徽标为“ 01”)或轻量级锁(徽标为“ 00”)。

  JDK 6中有偏见的JVM默认情况下打开。您可以通过JVM参数关闭偏置锁定:-xx:-usebiasedlocking = false。关闭后,该程序默认情况下将进入轻质锁定状态。

  轻巧的锁

  这意味着,当锁定向锁定时,其他线程将访问它。偏置锁将升级到轻质锁。其他线程将尝试通过旋转形式获得锁定,这不会阻止其提高性能。

  当代码进入同步块时,如果同步对象锁定状态不是锁定状态(锁定位置为“ 01”状态,是否偏向“ 0”),虚拟机将首先在当前中建立堆栈框架螺纹。名为锁定记录的空间用于存储锁定对象的当前标记单词的副本,然后将对象头部的标记单词复制到锁定记录。

  副本成功后,虚拟机将使用CAS尝试更新对象的标记单词作为锁定记录的指针,并将锁定记录中的所有者指针指向对象的标记单词。

  如果此更新操作成功,则该线程具有对象的锁定,并且对象标记字的锁定设置为“ 00”,表明对象处于轻质锁定状态。

  如果轻巧锁的更新操作失败,虚拟机将首先检查对象的标记单词是否指向当前线程的堆栈框架。如果这意味着当前线程已经具有该对象的锁定,那么您可以直接输入同步块,以继续继续继续继续继续下去。执行,否则,它将解释多个线程竞争锁。

  如果目前只有一个等待线程,则该线程正在旋转。但是,当旋转超过一定次,或者线程持有锁时,一个是旋转和第三次访问,轻量级锁被升级为重量级锁。

  重量级锁

  当将其升级到重量级锁时,锁定目标的状态值将变为“ 10”。目前,它存储在标记字中,以指向重量级锁的指针。此时,等待锁定的线程将进入阻止状态。

  总而言之,偏置锁通过比较标记单词以避免执行CAS操作来解决锁问题。灯重量锁可用于解决通过CAS操作和旋转锁定的问题,避免线程阻塞和唤醒。重量级锁定是阻止线程除了锁。