Java----JVM中的锁(synchronize/lock)

一、JVM锁原理

说到jvm的原理就要说到对象头了。

1.Java的每个对象都有对象头。如果是非数组类型,则用2个字宽来存储对象头,如果是数组,则会用3个字宽来存储对象头。在32位的处理器中,一个字宽是32位;在64位虚拟机汇总每一个字宽是64位。

Mark work的格式如图;


可以看到,对象状态为偏向锁是,Markwork存储的是偏向线程的id;当状态为轻量级锁时,Markword存储的是指向线程栈中LockRecord的指针;当状态为重量级锁时,MarkWork为指向堆的monitor对象的指针。

2.jvm锁原理(个人理解)

    在Java对象的对象头上,有一个锁的标记,比如,第一个线程执行程序时,检查Java对象头中的锁标记,发现Java对象头中的锁锁标记为未加锁状态,于是为Java对象进行了加锁操作,将对象头中标记设置为锁定的状态。第二个线程执行同样的程序时,也会检查家擦对象头中的锁标记,此时会发现Java对象头中的锁标记的状态为锁定状态。于是第二个线程会进入相应的阻塞队列中进行等待,关键点是Java对象头中的锁如何实现。

二、JVM的短板

    JVM中提供的synchronize和lock锁都是JVM级别的,当运行一个JVM级别的程序时,会启动一个JVM进程来运行我们的应用程序,synchronize和lock在JVM级别有效,也就是synchronize和lock在同一Java进程内有效。

    如果开发的应用是分布式,那么只用synchronize和lock会显示的非常吃力。

1.synchronize和lock支持jvm同一进程内部的线程互斥,synchronize和lock在JVM级别能够保证高并发程序的互斥,我们可以使用下图表示;

当我们将应用程序部成分布式架构,或者应用程序不再同一JVM进程运行时,synchronize和lock就不能保证分布式架构和JVM进程下的应用程序的互斥性。

2.synchronize和lock不能实现多JVM进程之间的线程互斥分布式架构和JVM进程的本质都是将应用程序部署在不同JVM实例中其本质还是多JVM进程。

你可能感兴趣的:(Java----JVM中的锁(synchronize/lock))