相关文章:
锁状态位之无锁
锁状态位之偏向锁
锁状态位之轻量级锁
锁状态位之重量级锁
1. 验证轻量级锁
我们创建一个对象,没有上锁(可偏向锁,锁标识为偏向锁,但偏向线程ID
为空),然后线程A上锁(真正加偏向锁,给偏向线程ID
赋值),A结束后,线程B接着上锁,此时产生竞争,但是由于A已经结束,是轻度的竞争,来观察锁标识位,我们期望是轻量级锁:
import org.openjdk.jol.info.ClassLayout;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//创建可偏向对象(偏向线程ID为空)
Object o = new Object();
System.out.println(ClassLayout.parseInstance(o).toPrintable());
//开启一个线程A,对象o加偏向锁(偏向线程ID为A)
new Thread(()->{
synchronized (o){
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
}).start();
try {
//确保线程A结束才会触发线程B加锁
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//验证对象o加偏向锁(偏向线程ID为A)
System.out.println(ClassLayout.parseInstance(o).toPrintable());
//启动线程B,此时A加锁后,会释放锁,线程B也接着在o上加锁
new Thread(()->{
synchronized (o){
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
}).start();
}
}
执行结果:
java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 88 fe 19 (00000101 10001000 11111110 00011001) (436111365)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 88 fe 19 (00000101 10001000 11111110 00011001) (436111365)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
java.lang.Object object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 30 f7 c4 1a (00110000 11110111 11000100 00011010) (449115952)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) e5 41 e4 27 (11100101 01000001 11100100 00100111) (669270501)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
Process finished with exit code 0
分析:第一条打印显示没有上锁(可偏向锁,锁标识为偏向锁,但偏向线程ID
为空)
第二条和第三条打印相同,显示线程A上锁(真正加偏向锁,给偏向线程ID
赋值)
第四条打印现实的是经B上锁后,变成了轻量级锁。
总结
如果是弱竞争,就是轻量级锁。什么是弱竞争?就是不同的线程虽然都访问同一个对象,但是实际上没有产生竞争,因为他们是依次去访问的,一个结束后,另一个才去访问,并且同一时刻没有冲突。