【发布时间】:2013-04-09 23:02:57
【问题描述】:
package demo5;
class Process extends Thread {
static int counter = 0;
public static synchronized void increment() { counter++; }
public void run() {
for (int i = 0; i < 1000000; i++)
{
increment();
}
System.out.println("Done.");
}
}
public class App {
public static void main(String[] args) throws InterruptedException {
Process p1 = new Process();
Process p2 = new Process();
p1.start();
p2.start();
p1.join();
p2.join();
System.out.println("Value of count is :" + p1.counter);
}
}
如果我将增量函数声明为非静态函数,那么最后计数器的值不会是 200 万。
另一方面,当增量方法定义为静态时,它可以正常工作。
据我所知,所有 Process 对象只有一个增量函数.. 那么为什么我必须将其声明为静态方法..?
谢谢
【问题讨论】:
-
你确定你的意思是
counter是static吗? -
您甚至可以在计数器中添加瞬态关键字并删除同步,它会起作用。
-
@shevchik Transient 不会影响它。你的意思是易变的吗?即使那样也行不通。
-
约翰,你是对的,易变的。为什么不工作?
-
因为一个增量是三个操作。读增量写。 Volatile 有助于提高单个操作的可见性,但由于增量是一种复合物,它无法对其做任何事情。
标签: java multithreading