Java线程锁机制是什么样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的 |
您所在的位置:网站首页 › 肩周炎的机制是什么样的 › Java线程锁机制是什么样的?偏向锁、轻量级锁、重量级锁有什么区别?锁机制是如何升级的 |
Java线程锁机制
新建maven工程导入如下包: org.openjdk.jol jol-core 0.10执行如下代码: public class Demo1 { public static void main(String[] args) { Object o = new Object(); System.out.println("不加锁对象:"); System.out.println(ClassLayout.parseInstance(o).toPrintable()); synchronized (o) { System.out.println("加锁对象:"); System.out.println(ClassLayout.parseInstance(o).toPrintable()); } } }以上代码是将对象在内存中的布局情况打印出来。 结果如下: 可以发现不加锁的对象和加锁的对象只有以上了信息不一样。 OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 28 0f 64 17 (00101000 00001111 01100100 00010111) (392433448) 12 4 (loss due to the next object alignment) 以上信息offset为偏移量,size为占字节大小; 而第一个四个字节为标志位(Markwork); 第二个四个字节为指向此对象的方法区的class对象,由于加锁和不加锁他们指向的都是同一个class对象,所以这里的信息一样; 第三行为对象的成员变量信息,很明显他们都是同一个对象所以这里的value也是一样的; 第四部分为补位信息,为了被8个字节整除。 所以可以得到结论Java加锁的机制就是在对象中Markwork做一个标记,记录锁状态。 偏向锁、轻量级锁、重量级锁区别
又上图可看出Markwork为01是无锁状态,而上面代码是用synchronized锁后,Markwork为00,即轻量级锁。 偏向锁、轻量级锁、重量级锁对应不同锁状态。 锁机制是如何升级的Java的锁机制是根据资源竞争的激烈程度不断进行锁升级的过程。从低到高依次是无锁,偏向锁,轻量级锁,重量级锁。 当线程执行时默认是无锁的,当同一个线程多次访问同一个资源(对象,方法等),将会给这个对象加上偏向锁,其目标就是引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径。如果当前的偏向锁被其他线程访问时,这些线程则会等待锁释放,并且不停的自旋,每隔一段时间尝试获取锁(看上去啥也没干,就像被锁住一样,自旋锁也称轻量级锁),锁也会升级为轻量级锁。当等待的线程多了后,很多线程在自旋,则会对jvm性能造成影响,这时JVM将会把情况上报给操作系统,操作系统将会对这些等待的线程进行管理,由于线程的管理给操作系统了,所以效率比较低,这时锁升级为重量级锁。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |