在更新后立即反映对两个线程之间的共享变量所做的更改

时间:2016-05-12 08:22:30

标签: java multithreading volatile

这些只是示例代码,问我的问题,其他语句被省略 这里NewClass的实例正在传递给Foot和Hand对象 因此所有实例NewClass,foot和hand共享NewClass的变量sno。

public class NewClass  {
     volatile int  sno = 100;

    public static void main(String args[])
    {
      NewClass n = new NewClass();  

      Foot f = new Foot(n); 
      Hand h = new Hand(n);

      f.start();
      h.start();

    }                
}

public class Foot implements Runnable{

    Thread t;
    NewClass n;
    public Foot(NewClass n)
    {
        this.n = n;
    }
    public void run(){
        for(int i=0;i<100;i++)
        {
            System.out.println("foot thread "+ i+" "+n.sno);
            n.sno=(-1)*n.sno;

             Thread.sleep(1); // surrounded by try-catch
        }
    }   
}

public class Hand implements Runnable {
    Thread t;
    NewClass n;
    public Hand(NewClass n)
    {
        this.n = n;
    }
    public void run(){
        for(int i=0;i<100;i++)
        {
            System.out.println("hand thread "+ i+" "+n.sno);
            n.sno=(-1)*n.sno;  
                Thread.sleep(1);  // surrounded by try -catch
        }
    }   
}

这里seq.no的符号每次都在变化,但是当被其他线程使用时,更改很多次没有被反映,好像更新需要时间。所以请帮忙,

1 个答案:

答案 0 :(得分:0)

更新并不需要很长时间。

[(3, 5, 6, 7, 6, 1), (3, 5, 3, 2, 6, 0), (3, 6, 1, 0, 5, 0)]

如果在两个并行运行的线程中发生这种情况,他们可能会同时将值视为正值。所以他们都将价值改为负值。如果你想控制变化,你需要一个信号量。

在NewClass中:

System.out.println("foot thread " + i + " " + n.sno);
n.sno=(-1)*n.sno;

在你的两个Runnables中:

volatile int sno = 100;
final Object semaphore = new Object();