2014-03-30 51 views
0

我有一個類作爲計算。我創建了兩個線程,都在這個類的不同實例上工作,並嘗試獲取i的值。但是兩者都給了我相同的價值觀。多線程 - 同步一個對象的所有實例的塊

我想如果一個實例的一個線程正在工作,那麼在其他實例上工作的線程應該等待。

public class Calculate { 
    private int i=2; 
    public void showNumber(){ 
     synchronized(Calculate.class){ 
      i=i+2; 
     } 
     System.out.println(Thread.currentThread()+"Value of i is "+i); 
    } 
} 

class Test1 implements Runnable{ 
    Calculate c=null; 
    public Test1(Calculate c){ 
     this.c=c; 
    } 
    @Override 
    public void run() { 
     System.out.println(Thread.currentThread()+" Running"); 
     c.showNumber(); 
    } 

} 
public class ThreadingPractise { 
    public static void main(String[] args) { 
     Calculate c=new Calculate(); 
     Calculate c1=new Calculate(); 
     Thread t1=new Thread(new Test1(c),"t1"); 
     Thread t2=new Thread(new Test1(c1),"t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+0

你如何讓事情等待/阻止?什麼代碼應該等待? –

+0

這裏我創建了Calculate類的兩個實例,並且兩個線程都在獨立實例上工作,所以我獲得了變量i的相同值。但我想如果一個線程正在工作,那麼其他實例的其他線程應該得到更新值 –

+0

無處不在,我得到的是,如果你在類級別獲取鎖,那麼同步塊將由一個線程訪問該對象的每個實例。 請參閱http://programmers.stackexchange.com/questions/206732/how-to-make-a-method-synchronized-across-all-instances-of-an-object –

回答

1

使i爲靜態。如果你想在線程之間共享變量。並同步showNumber方法而不是Calculate.class,以便一次只有一個線程運行它。

+0

通過使用靜態它工作正常。我不理解這個概念。通過使用同步方法,只能停止在一個實例上工作的線程。但是如何使一個方法在一個對象的所有實例中同步。 –

+0

當你創建新的實例。每個實例將擁有它自己的i值。它不是在擁有它的線程之間共享的,而是它自己的實例。只有在線程之間共享數據時,同步纔會顯示。你可以閱讀關於線程的java教程來很好地理解這個概念。 –

+0

@Naruto ...因此,如果我寫同步(Calculate.class),那麼它將確保只有一個線程修改此塊,即使創建n個實例?你可以更清楚地說明這一點... –