日期:2014-05-20  浏览次数:20650 次

同步方法问题
新手求教,synchronized方法中的给对象上锁,是给调用同步方法的对象上锁还是给同步方法所在的类的对象上锁呢?求大神能详细的指导下,在这方面一直觉得模棱两可的,在此谢谢谢谢。好人有好报。
------解决方案--------------------
引用:
那就是说比如一个类里有三个同步方法,但是我只要new出几个新的对象我就可以分别操作每个同步方法了?一个对象只能操作一个同步方法,只有当此同步方法执行完了才能在执行其他的同步方法了?


你的理解是对的。如果synchronized没有明确对哪个对象加锁的情况下,则是对this对象加锁。

但是你可以对指定对象加锁的啊。
Object lockObj = new Object();

public void fun(){
  synchronized(lockObj){
  }
}
------解决方案--------------------
1,多个方法的多线程情况
当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。

  Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法。

  注意这时候是给对象上锁,如果是不同的对象,则各个对象之间没有限制关系。

2,考虑静态的同步方法
如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的类所对应的Class对象。Java中,无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始。