这些只是示例代码,问我的问题,其他语句被省略 这里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的符号每次都在变化,但是当被其他线程使用时,更改很多次没有被反映,好像更新需要时间。所以请帮忙,
答案 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();