Synchronized同步锁 不同方式实现原理分析

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");
    }

} 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容