Java多线程/锁/synchronized

总结

synchronized使用简单,JVM后期会进行优化,建议使用
synchronized可以修饰代码块:对象做锁、字节码做锁。
synchronized可以修饰方法:成员方法、静态方法
synchronized可以保证原子性(同步代码一次只能被一个线程执行),可见性(线程工作内存<-变量->主存),有序性(指令排列)

分析

synchronized修饰方法:

  • 是隐式同步的,JVM可以根据方法表中的ACC_SYNCHRONIZED访问标志来区分一个方法是否是同步方法

synchronized修饰代码块:

  • 对象或字节码做锁是显式同步的,使用monitor对象通过monitor enter和monitor exit字节码指令来控制线程对管程的持有和释放
  • monitor对象:同步状态_count;同步队列_EntryList;等待队列_WaitList
  • 管程:进程同步机制之一,类似于搞个秘书,每次只允许一个进程进门访问资源

使用/修饰方法

package com.xcrj.thread;

public class SyncKeywords {
    private static int a = 10;

    private static synchronized void inc() {
        SyncKeywords.a++;
    }

    public static void main(String[] args) {

    }
}

使用/修饰代码块

package com.xcrj.thread;

public class SyncKeywords {
    private static int a = 10;

    private static void inc() {
        // 字节码做锁,锁住字节码
        synchronized (SyncKeywords.class) {
            SyncKeywords.a++;
        }
    }

    private static void dec() {
        // 对象做锁
        synchronized (new Object()) {
            SyncKeywords.a--;
        }
    }

    public static void main(String[] args) {

    }
}


版权声明:本文为baidu_35805755原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。