我已经写了一些多线程代码在java和同步的方法,改变了变量,但它不同步我的代码,我仍然得到随机值。这里是我的代码:为什么在此多线程程序中不同步访问同步方法?
public class Main {
public static void main(String[] args) throws Exception {
Resource.i = 5;
MyThread myThread = new MyThread();
myThread.setName("one");
MyThread myThread2 = new MyThread();
myThread.start();
myThread2.start();
myThread.join();
myThread2.join();
System.out.println(Resource.i);
}
}
class MyThread extends Thread {
@Override
public void run() {
synMethod();
}
private synchronized void synMethod() {
int i = Resource.i;
if(Thread.currentThread().getName().equals("one")) {
Thread.yield();
}
i++;
Resource.i = i;
}
}
class Resource {
static int i;
}
有时候我7,有时6,但我已经同步synMethod
,据我所知没有线程应该在这个方法,而其他线程执行这一点,所以操作应该是原子,但他们不是,我不明白为什么?你能否向我解释,并回答 - 我该如何解决?
你同步的问题锁定什么。我建议你不要使用子类Thread,因为这会导致令人惊讶的结果。 –