先看jvm对多线程关于对象锁的介绍
java虚拟机调用同步方法或者从同步方法中返回没有使用特别的操作码,当虚拟机解析对方法的符号引用时,他判断这个方法是否是同步的。如果是同步的,虚拟机在调用方法之前要获得这个锁。对于实例方法来说。
虚拟机在方法将要被调用的时候获取对象相关联的锁。对于类方法来说,他获取的是所属类的锁。其实是对Class对象上锁。当同步方法执行完毕的时候,不管正常结束还是抛出异常,虚拟机会释放锁!!
先看两个特别简单的方法 都是同步的
你应该采用哪个方法呢
首先有两个理由
1 同步方法产生的字节码少
看两个方法产生的字节码
[img]http://dl.iteye.com/upload/picture/pic/69746/1a140ede-8af1-3c10-96ff-f0e3eec14d24.jpg[/img]
2
同步块的方法创建了异常表,finanal 是指如果发生异常,对象最后都要释放锁!!
同步方法就不一样,他持有的类对象的锁,他执行完方法一定要释放锁!!
下面看关于对线程方法的约束
[img]http://dl.iteye.com/upload/picture/pic/69744/5419a09f-3363-3e73-a055-716c869467b8.jpg[/img]
java虚拟机调用同步方法或者从同步方法中返回没有使用特别的操作码,当虚拟机解析对方法的符号引用时,他判断这个方法是否是同步的。如果是同步的,虚拟机在调用方法之前要获得这个锁。对于实例方法来说。
虚拟机在方法将要被调用的时候获取对象相关联的锁。对于类方法来说,他获取的是所属类的锁。其实是对Class对象上锁。当同步方法执行完毕的时候,不管正常结束还是抛出异常,虚拟机会释放锁!!
先看两个特别简单的方法 都是同步的
public void walk()
{
synchronized(this)
{
}
}
public synchronized void walk2(){}
}
你应该采用哪个方法呢
首先有两个理由
1 同步方法产生的字节码少
看两个方法产生的字节码
public void walk()
{
// 0 0:aload_0
// 1 1:dup
// 2 2:astore_1
// 3 3:monitorenter
// try 4 6 handler(s) 9
// 4 4:aload_1
// 5 5:monitorexit
// 6 6:goto 14
// finally // try 9 12 handler(s) 9
// 7 9:astore_2
// 8 10:aload_1
// 9 11:monitorexit
// 10 12:aload_2
// 11 13:athrow
// 12 14:return
}
public synchronized void walk2()
{
// 0 0:return
}
[img]http://dl.iteye.com/upload/picture/pic/69746/1a140ede-8af1-3c10-96ff-f0e3eec14d24.jpg[/img]
2
同步块的方法创建了异常表,finanal 是指如果发生异常,对象最后都要释放锁!!
同步方法就不一样,他持有的类对象的锁,他执行完方法一定要释放锁!!
下面看关于对线程方法的约束
[img]http://dl.iteye.com/upload/picture/pic/69744/5419a09f-3363-3e73-a055-716c869467b8.jpg[/img]