这是我的代码:
public class MyRunnableClass implements Runnable {
static int x = 25;
int y = 0;
private static final Object sharedLock = new Object();
@Override
public void run() {
while(x>0){
someMethod();
}
}
public synchronized void someMethod(){
synchronized (sharedLock){
x--;
y++;
}
}
}
和测试类:
public class MyRunnableClassTest {
public static void main(String[] args) throws InterruptedException {
MyRunnableClass aa = new MyRunnableClass();
MyRunnableClass bb = new MyRunnableClass();
Thread a = new Thread(aa);
Thread b = new Thread(bb);
a.start();
b.start();
a.join();
b.join();
System.out.println(aa.y + bb.y);
}
}
当我按原样运行此代码时,我看到输出25很好,但是当x为250时,我看到251。为什么?为什么不250?
在执行操作时:
while(x>0){
someMethod();
}
假设x = 1并且:
线程A将x> 0评估为true,然后进入循环。假设线程A在下一行执行之前被中断。线程B还将x> 0评估为true并进入循环。
两者都将x依次递减,并将y递增。
为了解决这个问题,x> 0的检查也必须处于锁定状态。
前任:
public class MyRunnableClass implements Runnable {
static int x = 25;
int y = 0;
private static final Object sharedLock = new Object();
@Override
public void run() {
while(x>0){
someMethod();
}
}
public synchronized void someMethod(){
synchronized (sharedLock){
if(x > 0){
x--;
y++;
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句