2011-10-05 67 views
7

我在同一个文件中有以下程序。我已经同步了run()方法。为什么同步方法允许多个线程同时运行?

class MyThread2 implements Runnable { 
    Thread t; 

    MyThread2(String s) { 
     t=new Thread(this,s); 
     t.start(); 
    } 

    public synchronized void run() { 
     for (int i=0;i<3;i++) { 
      System.out.println("Thread name : "+ Thread.currentThread).getName()); 
      try { 
       t.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.getMessage(); 
      } 
     } 
    } 
} 

class TestSync { 
    public static void main(String[] args) { 
     MyThread2 m1=new MyThread2("My Thread 1"); 
     c.fun(); 
    } 
} 

class c { 
    static void fun() { 
     MyThread2 m1=new MyThread2("My Thread 4"); 
    } 
} 

输出

Thread name : My Thread 1 
Thread name : My Thread 4 
Thread name : My Thread 4 
Thread name : My Thread 1 
Thread name : My Thread 1 
Thread name : My Thread 4 

我的问题是,为什么是同步的方法,同时允许“我的线程1”和“我的主题4”线程同时访问?

+2

您发布的代码至少有一个语法错误,而且很难按原样阅读。确保你发布你的实际代码,并尝试格式化它的清晰。 – Mat

+0

误解是你正在锁定一个方法,而你有一个锁定实例的方法。 –

回答

27

​​方法在实例级别工作。该类的每个实例都有自己的锁。每次输入实例的任何​​方法时都会获取锁。这可以防止多个线程在同一个实例上调用​​方法(注意,这也可以防止不同的​​方法在相同实例上被调用)。

现在,由于您有两个类的实例,每个实例都有自己的锁。没有什么可以阻止两个线程同时在自己的实例上运行。

如果你想避免这种情况,你可以有内部run(),其中obj将是你的类的两个实例共享一些对象synchronized(obj)块:

class MyThread2 implements Runnable { 
    private static final Object lock = new Object(); 
    ... 
    public void run() { 
    synchronized(lock) { 
     ... 
    } 
    } 
} 
+0

感谢您的回答 – user980089

+0

如果我们只有一个类和多个线程的实例,是否可以同时运行一些'synchronized'方法? – Sajad

+0

@ssss:当然:'静态'与非'静态',使用'同步'块与不同的锁等。如果您需要更多信息,请发布一个新问题。 – NPE

相关问题