1.Synchronized
1.1 简介
Java的关键字,提供了并发场景下的数据可见性和原子性,保证线程安全
1.2 应用方式
修饰实例方法:对当前实例加锁,当两个不同的实例对象同时操作共享资源时,可能出现线程安全问题。
public synchronized void increase()
修饰静态方法:对当前类的Class对象加锁,当多个实例对象同时操作静态方法中的共享资源时,可以保证线程安全。线程A调用一个实例对象的非static synchronized方法,线程B调用类的static synchronized方法是被允许的,因为一个是Class对象锁,一个是实力对象锁。
public static synchronized void increase()
修饰同步代码块:给指定对象加锁
synchronized(instance/this)
1.3 原理
前提:每个对象都有一个对象头,对象头中有一个和synchronized相关的字段,该字段是一个指向monitor对象的指针,synchronized通过获取monitor对象的方式获取锁。(可以去这个链接查看一下更加详细的解释链接)
synchronized修饰代码块的底层原理
依赖于monitor对象的enter和exit操作,对应于monitorenter和monitorexit字节码指令,这两个指令分别指明了同步代码块的起始和结束位置,执行monitorenter时尝试获取对monitor的持有权,如果此时monitor的计数器为0,则获取到这个锁,并将计数器设置为1。
synchronized修饰方法的底层原理
方法级的同步是隐式的,不需要通过字节码指令来控制