2010-09-11 97 views
6

我不熟悉Java线程和同步。Java同步问题

可以说我有:

public class MyClass(){ 

    public synchronized void method1(){ 
     //call method2(); 
    } 

    public synchronized void method2(){}; 

} 
  1. 是什么意思,当我同步一个实例对象的method1()?因此,当一个线程在尝试访问synchronized method1()时获取了锁,是否阻止其他线程访问来自同一对象的另一个synchronized method2()

  2. 比方说,访问方法1(当一个线程获取锁),但让说method1()使得以method2()通话,这也是​​。这可能吗?我的意思是有没有任何规则可以阻止method1()呼叫method2()

在此先感谢。

回答

4
  1. See here

    ,不可能对同一对象上同步方法来交错两个调用。当一个线程正在执行一个对象的同步方法时,所有其他线程调用同一对象的同步方法块(挂起执行),直到第一个线程完成对象。

  2. 因为这个线程在当前对象的锁,它可以调用method2(),并没有其他线程。

7
  1. 是,使用在非静态方法中的​​方法修饰符意味着它使用方法被调用的实例的显示器,这是所有这些方法之间共享。
  2. 否 - 线程已经拥有显示器,因此可以自由输入由同一显示器保护的其他块。
2

问题2的说明,方法1()也可以调用同步方法也在其他这可能导致死锁:

线程1调用同步方法1(),这反过来又需要调用同步method_b ()in OtherClass Thread2在AnotherClass上保存锁,并且正在执行一个方法,该方法需要在其锁定由Thread1保持的类中调用method1()方法

两个线程都将阻塞等待另一个释放锁,僵局。

2

(1)这相当于:

public void method1(){ 
    synchronized (this) { 
     ... 
    } 
} 

因此,同步在当前实例。如果我们用相同的方法重写method2 ...

public void method2(){ 
    synchronized (this) { 
     ... 
    } 
} 

...那么您可以清楚地看到它们锁定在同一个对象上,因此其他线程无法调用method1或method2,直到method1退出它的​​块为止。

(2)​​块是可重入的,这意味着同一个线程可以输入其他​​块,可以根据需要多次锁定相同的对象。据我了解,每次输入​​块时,Java都会将您正在同步的对象的计数器增加1,并且每次退出​​块时,都会减少它。当该计数器达到0时,锁定被释放。