虚拟机内存模型与高效并发丶一个站在Java后端设计之路的男青(3)

电脑杂谈  发布时间:2019-06-30 12:12:23  来源:网络整理

从上面我们可以看出,实际上当一个线程获取了一个对象的轻量级锁之后,对象的Mark Word会指向线程的栈帧中的Lock Record,而栈帧中的Lock Record也会指向对象的Mark Word。 栈帧中的Lock Record用于判断当前线程已经持有了哪些对象的锁,而对象的Mark Word用来判断哪个线程持有了当前对象的锁。 当一个线程尝试去获取一个对象的锁的时候,会先通过锁标志位判断当前对象是否被加锁,然后通过CAS操作来判断当前获取该对象锁的线程是否是当前线程。

偏向锁:和轻量级锁原理基本一致,但偏向锁在无竞争的情况下把整个同步都消除掉,连cas操作都不做了。为了程之间更高效的共享数据,以及解决竞争问题,从而提高程序的执行效率,创建了各种锁优化技术:适应性自旋(adaptive spinning)、锁消除(lock elimination)、 锁粗化(lock coarsening)、轻量级锁(lightweight locking)、偏向锁(biased locking)等。除此之外,跨境电商创业者还必须要关注和留意的核心数据是竞争度指标,从这个直通车的竞争度指标可以了解到速卖通平台卖家竞争的程度,同样的道理,关键词竞争越激烈行业竞争越激烈,如果创业者要进入这个行业,就应该仔细审核自己的优势,在深思熟虑后再进入这个品类。

一个对象刚开始实例化的时候,没有任何线程来访问它的时候。它是可偏向的,意味着,它现在认为只可能有一个线程来访问它,所以当第一个线程来访问它的时候,它会偏向这个线程。此时,对象持有偏向锁,偏向第一个线程。这个线程在修改对象头成为偏向锁的时候使用CAS操作,并将对象头中的ThreadID改成自己的ID,之后再次访问这个对象时,只需要对比ID,不需要再使用CAS在进行操作。

一旦有第二个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象时偏向状态,这时表明在这个对象上已经存在竞争了,检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,则马上执行那个线程的操作栈,检查该对象的使用情况,如果仍然需要持有偏向锁,则偏向锁升级为轻量级锁,(偏向锁就是这个时候升级为轻量级锁的)。如果不存在使用了,则可以将对象回复成无锁状态,然后重新偏向。

轻量级锁认为竞争存在,但是竞争的程度很轻,一般两个线程对于同一个锁的操作都会错开,或者说稍微等待一下(自旋),另一个线程就会释放锁。 但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁膨胀为重量级锁,重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。

如果大多数情况下锁总是被多个不同的线程访问,那么偏向模式就是多余的,可以通过-XX:-UserBiaseLocking禁止偏向锁优化。

轻量级锁和偏向锁的提出是基于一个事实,就是大部分情况下获取一个对象锁的线程都是同一个线程,它在这种情形下的效率会比重量级锁高,当锁总是被多个不同的线程访问它们的效率就不一定比重量级锁高。 因此,它们的提出不是用来取代重量级锁的,但在一些场景中会比重量级锁效率高,因此我们可以根据自己应用的场景通过虚拟机参数来设置是否启用它们。

JMM是Java实现并发的理论基础,JMM种规定了8种操作与8种规则,并对voliate、long和double类型做了特别的规定。

JVM会对我们的代码进行重排序以优化性能,对于重排序,JMM又提出了先行发生原则(happens-before)和as-if-serial语义,以保证程序的最终结果不会因为重排序而改变。

Java的线程是通过一种轻量级进行映射到内核线程实现的。我们可以使用互斥同步、非阻塞同步和无同步三种方式来保证多线程情况下的线程安全。此外,Java还提供了多种锁优化的策咯来提升多线程情况下的代码性能。

当然也可以利用java的多线程进行并发测试主存和内存的区别,但由于篇幅和时间所限,本文不再涉及此方面的内容。chakra的内容介绍到此结束,限于个人水平以及篇幅内容,先介绍的就是这么多,其实基本调试方法和调试之前的代码没啥两样,这里的调试很容易就能够举一反三。此书和《javaee并发编程实战》相反,这本书的特点是大篇幅的代码+小篇幅的精讲解,可能这和中国人写的书比较偏向实用主义的风格有关。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-109490-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...