【发布时间】:2014-09-02 22:51:48
【问题描述】:
我想确认我对此的理解-
public class Main {
private static int j = 0;
private int k = 0;
public static void main(String[] args) {
Main obj = new Main();
obj.doProcess();
}
public void doProcess() {
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 4; i++) {
service.submit(new SingleProcessor());
}
}
public static void myStaticMethod() {
System.out.println("my static method");
int i = 0;
i++;
j++;
System.out.println("i " + i);
System.out.println("j " + j);
}
public void myInstanceMethod() {
System.out.println("my instance method");
int i = 0;
i++;
k++;
System.out.println("k " + k);
}
private class SingleProcessor implements Runnable {
@Override
public void run() {
System.out.println("single run starts" + Thread.currentThread().getName());
myStaticMethod();
myInstanceMethod();
}
}
}
当线程运行时,它会获得自己的方法副本,无论是静态方法还是实例方法 - 在这些方法中创建的任何变量都是本地的并且特定于该线程。就像这个方法的多个“实例”同时执行一样,内部创建的任何变量都不是共享的(它是本地的)。
但是参数(静态或实例)由线程共享。
所以在上面的例子中 - i 是本地的并且特定于线程。 j 是共享的。 k 是共享的。
输出 -
single run startspool-1-thread-1
single run startspool-1-thread-2
my static method
single run startspool-1-thread-3
my static method
i 1
i 1
j 2
j 2
my instance method
my instance method
k 1
k 2
my static method
i 1
j 3
my instance method
k 3
single run startspool-1-thread-4
my static method
i 1
j 4
my instance method
k 4
我的理解是 100% 正确的吗?有人愿意用更好的词来形容吗?
谢谢。
【问题讨论】:
标签: java multithreading concurrency static-members instance-variables