package com.example.thread;
/**
* 线程锁.
* <p>
* Synchronized同步锁 不同方式实现原理分析
*
* 通过javap -v ThreadSynchronizedLock.class命令查看java编译器生成的字节码
*/
public class ThreadSynchronizedLock {
private final Object lock = new Object();
/**
* 同步锁修饰实例方法
*
* flags: ACC_PUBLIC, ACC_SYNCHRONIZED
* ACC_PUBLIC 方法修饰符
* todo ACC_SYNCHRONIZED 就是同步锁标识
*/
public synchronized void lockMethod() {
/**
* Code:
* stack=2, locals=3, args_size=1
* 0: aload_0
* 1: getfield #3 // Field lock:Ljava/lang/Object;
* 4: dup
* 5: astore_1
* todo 6: monitorenter
* 7: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
* 10: ldc #7 // String synchronized block
* 12: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
* 15: aload_1
* todo 16: monitorexit
* 17: goto 25
* 20: astore_2
* 21: aload_1
* todo 22: monitorexit
* 23: aload_2
* 24: athrow
* 25: return
*
* */
System.out.println("synchronized method");
}
/**
* 同步锁修饰代码块 方式1
*/
public void lockBlock() {
synchronized (lock) {
System.out.println("synchronized block");
}
}
/**
* 同步锁修饰代码块 方式二
*
* flags: ACC_PUBLIC
*
*/
public void lockClass() {
/**
*
* Code:
* stack=2, locals=3, args_size=1
* 0: aload_0
* 1: dup
* 2: astore_1
* todo 3: monitorenter // 加锁位置
* 4: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
* 7: ldc #8 // String synchronized class
* 9: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
* 12: aload_1
* todo 13: monitorexit // 释放锁位置
* 14: goto 22
* 17: astore_2
* 18: aload_1
* todo 19: monitorexit // 异常处理释放锁位置
* 20: aload_2
* 21: athrow
* 22: return
*
* */
synchronized (this) {
System.out.println("synchronized class");
}
}
/**
* 同步锁修饰静态方法
*
* flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNCHRONIZED
* ACC_PUBLIC 方法修饰符
* ACC_STATIC 静态方法
* todo ACC_SYNCHRONIZED 就是同步锁标识
*/
public synchronized static void lockstaticMethod() {
System.out.println("synchronized lockstaticMethod");
}
}
Synchronized同步锁 不同方式实现原理分析
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 总而言之,每个对象都有对象头,对象头里有mark word,存储对象的元数据信息的指针,hashcode,分代年龄...
- 一.同步的基本思想 目的:为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 1.在共享...
- Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和...
- 先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互...