考虑以下代码:
static class ThreadTest extends Thread {
int x;
int[] y;
public ThreadTest(int x, int[] y) {
this.x = x;
this.y = y;
}
@Override
public void run() {
while (x< 10) {
++x;
System.out.print("0");
}
while (y[0] < 10) {
++y[0];
System.out.print('1');
}
}
}
public static void main(String args[]) {
int x = 0;
int[] y = new int[1];
y[0] = 0;
Thread A = new ThreadTest(x, y);
Thread B = new ThreadTest(x, y);
B.start();
A.start();
}
将打印多少个 1 和多少个 0?
如何保证程序每次运行时1的个数相同?
请注意,该类是static
如何评估“1”的最大和最小出现次数?
目前,您的代码包含竞争条件 https://stackoverflow.com/questions/34510/what-is-a-race-condition因为两个线程正在修改相同的内容y
大批。这意味着打印的 1 的数量是不确定的。
如何保证程序每次运行时1的个数相同?
您需要在两个线程之间引入同步。
这可以通过多种方式来完成。 Java 中最常见的是使用synchronized
阻止修改和/或读取共享状态的代码。
另一种方法是更换int[1]
数组与单个AtomicInteger http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html。这对于这个特殊情况来说非常有效。
请注意该类是静态的
班级是否static
在这里完全无关。这一切意味着 https://stackoverflow.com/a/3584151/367273这是一个实例ThreadTest
没有对外部类实例的隐式引用。它与实例之间的状态共享无关ThreadTest
(我认为这就是你在这里暗示的意思)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)