2014-01-30 68 views
-1

如果一個對象的方法是同步的,另一個不是,那麼兩個不同的線程可以同時運行它們嗎?我知道當一個方法被標記爲同步時,內部鎖必須被獲取,但第二個方法不同步,這是否重要?或者,如果一個線程獲得鎖定,所有的方法都不能輸入?兩個方法(一個同步另一個不)和兩個線程

+0

你爲什麼不嘗試呢?你爲什麼不讀[教程](http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html)? –

+0

取決於您獲得的鎖的類型。對象級別或類級別。 –

回答

1

是的。兩個線程可以同時執行這兩種方法。線程可以鎖定同步方法,但鎖定不需要執行非同步方法。

1

我相信這兩種方法可以在同一個對象上同時運行,這是因爲其中一個是​​只會讓使用該對象&獲取它的內部鎖的,但作爲非同步的方法不會利用鎖,他們都可以同時運行。我碰到相同的情況&發現關於聲明正確。見下面的例子更加清晰:

class LockTest { 

    // Sync Method. Will acquire the lock 
    public synchronized void meth1() { 
     System.out.println(Thread.currentThread().getName() 
       + " is executing method1."); 
     try { 
      Thread.sleep(1000); // to show some processing, Won't release the 
           // lock 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out 
       .println(Thread.currentThread().getName() + " ended method1."); 
    } 

    // No lock is required in this method 
    public void meth2() { 
     try { 
      Thread.sleep(1);// to let meth1 execute first & acquire the lock 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(Thread.currentThread().getName() 
       + " is executing method2."); 
     System.out 
       .println(Thread.currentThread().getName() + " ended method2."); 
    } 

    public static void main(String[] args) throws Exception { 
     final LockTest oracle = new LockTest(); 
     Thread t1 = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       oracle.meth1(); 

      } 
     }, "BigThread"); 

     Thread t2 = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       oracle.meth2(); 

      } 
     }, "SmallThread"); 

     t1.start(); 
     t2.start(); 
     t1.join(); 
     t2.join(); 
    } 
} 

以上代碼生成輸出爲:

BigThread is executing method1. 
SmallThread is executing method2. 
SmallThread ended method2. 
BigThread ended method1. 

輸出顯示method2method1也相同對象oracle上同時執行的執行。

相關問題