本篇文章给大家带来的内容是关于Java中synchronized关键字的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇介绍synchronized关键字的使用方式,区别和偏向锁、轻量锁和重量锁实现原理。
先看看synchronized关键字的4种用法。
1、修饰普通方法
private synchronized void synMethod(){}
这种用法中,synchronized锁的对象实例。
2、修饰静态方法
private static synchronized void synMethod(){}
synchronized在这种情况下,锁的是当前Class类对象。
3、同步方法块
private void synMethod1(){ synchronized(this){ } } private void synMethod2(){ synchronized(ThreadTest.class){ } }
synMethod1中锁对象实例;synMethod2的是当前Class类对象。
再介绍锁原理
在介绍锁原理之前,先认识一下Java对象头Mark Word,以32位为例。
锁状态 |
25 bit |
4bit |
1bit |
2bit |
||
|
23bit |
2bit |
是否偏向锁 |
锁标志位 |
||
轻量级锁 |
指向栈中锁记录的指针 |
0 |
||||
重量级锁 |
指向互斥量(重量级锁)的指针 |
10 |
||||
GC标记 |
空 |
11 |
||||
偏向锁 |
线程ID |
Epoch |
对象分代年龄 |
1 |
01 |
|
无锁 |
对象的hashCode |
对象分代年龄 |
0 |
01 |