java SYNCHRONIZED

本文深入解析Java中synchronized关键字的使用方法及其实现原理。包括synchronized在方法和代码块中的应用,以及如何通过monitorenter和monitorexit指令实现对象级的锁管理。
java SYNCHRONIZED 博客分类: java

public class LockTest2 {
static byte[] staticObj =new byte[0];
byte[] obj =new byte[0];


/**
* 无锁
*/
public void t0(){
}
/**
* 无锁
*/
public static void t1(){
}

/**
* 对该类的所有实例加锁
*/
public static synchronized void t2(){
}

/**
* 对当前对象实例加锁
*/
public synchronized void t3(){
}

/**
* 在对象的非静态属性上加锁等同与t3()
* @param o
*/
public void t4(LockTest2 o){
synchronized(o.obj){
}

}

/**
* 在对象的静态属性(对象)上加锁等同于方法t2
* @param o
*/
public void t5(LockTest2 o){
synchronized(o.staticObj){
}

}

}

 

D:\workspace\eclipse2\listTest\bin>javap -c LockTest2
Compiled from "LockTest2.java"
public class LockTest2 extends java.lang.Object{
static byte[] staticObj;

byte[] obj;

static {};
Code:
0: iconst_0
1: newarray byte
3: putstatic #11; //Field staticObj:[B
6: return

public LockTest2();
Code:
0: aload_0
1: invokespecial #16; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: newarray byte
8: putfield #18; //Field obj:[B
11: return

public void t0();
Code:
0: return

public static void t1();
Code:
0: return

public static synchronized void t2();
Code:
0: return

public synchronized void t3();
Code:
0: return

public void t4(LockTest2);
Code:
0: aload_1
1: getfield #18; //Field obj:[B
4: dup
5: monitorenter
6: monitorexit
7: return

public void t5(LockTest2);
Code:
0: getstatic #11; //Field staticObj:[B
3: dup
4: monitorenter
5: monitorexit
6: return

}

 

当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
而synchronized (obj)则是通过这2个指令monitorenter monitorexit

感觉synchronized (obj)更加灵活啊!

转载于:https://my.oschina.net/xiaominmin/blog/1598160

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值