【发布时间】:2016-08-14 06:47:31
【问题描述】:
我在 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 子类化,因为这会导致令人惊讶的结果。
标签: java multithreading synchronized