一、Synchronize关键字
-
特点:
线程安全,提供同步机制,重量级锁—>可以进行锁的优化 -
使用:
- 修饰代码块,作用于代码块
- 修饰普通方法,作用于对象
- 修饰静态方法,作用于当前类
-
Synchronize是如何保证同时只能有一个线程访问:
(反汇编展示:)
1. 修饰代码块时,底层提供monitorexit和monitorEnter来达到获取锁和释放锁的过程。
2. 修饰普通方法,底层有ACC_SYNCHRONIZED的标识
3. 修饰静态方法,底层有ACC_STATIC和ACC_SYNCHRONIZED的标识
底层都是通过获取monitor对象来获取锁,monitor对象是OS提供的mutex锁机制来完成线程获取对象和释放对象
public class SynchronizeDemo {
//修饰代码块
public static void SynObj(){
Object o = new Object();
synchronized(o){
System.out.println("修饰代码块");
}
}
//修饰普通方法,作用于对象
public synchronized void fun(){
System.out.println("修饰普通方法");
}
//修饰静态方法,作用于当前类
public synchronized static void test(){
System.out.println("修饰静态方法");
}
public static void main(String[] args) {
SynchronizeDemo synchronizeDemo = new SynchronizeDemo();
synchronizeDemo.fun();
SynchronizeDemo.test();
SynchronizeDemo.SynObj();
}
}