2014-03-30 53 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个实例?你可以更清楚地说明这一点... –