2014-03-05 87 views
0

感觉很好成为这个社区的一部分。已经阅读了很多答案,清除了我对许多问题的疑惑,但没有找到一个答案。我知道同步是如何在Java中工作的,但是当线程通过另一个类调用同步方法时,会发现错误的行为。线程通过另一个类调用同步方法时会发生什么?

PSB我试过的:

A类同步方法“meth1”。与非synhronized法 “meth2”

package threadinterview; 

public class B { 
public void meth2() { 
    A a1 = new A(); 
    a1.meth1(); 
} 
} 

主要类

package threadinterview; 

public class A { 
public synchronized void meth1() 
{ 
    for(int i=0; i<3; i++) 
    { 
     System.out.println("meth1: " + Thread.currentThread().getName()); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      System.out.println("Interrupted: " + Thread.currentThread().getName()); 
     } 
    } 
} 

B级在这种情况下运行该项目

package threadinterview; 
public class ThreadImpl { 
public static void main(String[] args) { 
    final B b1 = new B(); 
    final B b2 = new B(); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      b1.meth2(); 
     } 
    }).start(); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      b1.meth2(); 
     } 
    }).start(); 
} 
} 

现在,即使我最终运行同步方法,我看不到同步的效果。在这里我所得到的,当我运行程序:

meth1: Thread-0 
meth1: Thread-1 
meth1: Thread-0 
meth1: Thread-1 
meth1: Thread-0 
meth1: Thread-1 

而且,如果我做了synchronized方法静态为好,然后我得到了一流水平锁,可以看到的地方同步效果。我严重不明白为什么类级锁定工作,但在这种情况下对象级别不起作用。

回答

2

每次调用

public void meth2() { 
    A a1 = new A(); 
    a1.meth1(); 
} 

创建一个新的A对象。​​上的方法在this上同步对象本身。因此,您正在同步不同的对象。一个同步调用不会阻止另一个同步调用,因为两个线程都获得不同的监视器。

+0

明白了。不难,但没有点击。万分感谢。 :) – user3384573

0

我认为你误解了'同步效应'。在你的例子中,你从两个独立的线程中调用B.meth2()。此方法创建类A的新实例,然后调用A.meth1()。现在无论你想要在meth1()上执行什么锁定(这在你的例子或描述中都不是很清楚),它是无关紧要的,因为你在类A的两个不同实例上调用它,即隐式使用两个不同的锁。

相关问题