내가이 내 이해를 확인하려는 공유 -멀티 스레딩은 : 스레드 방식의 자신의 사본을 얻을 수 있지만, 매개 변수는
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();
}
}
}
쓰레드가 실행, 그것은 정적, 그 방법 중 자신의 복사본이다 얻는다 또는 인스턴스 메소드 - 이러한 메소드 내부에서 작성된 변수는 로컬이며 해당 스레드에만 해당됩니다. 이 메소드의 여러 '인스턴스'가 동시에 실행되는 것과 비슷합니다. 내부에서 생성 된 변수는 공유되지 않습니다 (로컬 임).
그러나 매개 변수 (정적 또는 인스턴스)는 스레드에 의해 공유됩니다.
위의 예에서 - 은 스레드에 국한되어 있습니다. 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 % 정확합니까? 누구든지 더 나은 단어를 넣으시겠습니까?
감사합니다.
정적 변수를 싱글 톤과 비교하는 것은 좋은 생각이라고 생각하지 않습니다. 싱글 톤에 정적 변수가 사용된다는 사실은이를 수행하는 방법입니다. 고정 변수는 최종 변수가 아닌 경우 변경할 수 있습니다. 또한, 그 대답은 그 시점으로가는 것 같지 않습니다 (예 : stack vs heap에 대해 논의) –
아마도, 나는 Singleton이라는 단어를 사용해서는 안됩니다. 나는 메모리에 동일한 참조가 모든 스레드에 의해 사용된다는 것을 보여주기 위해 'metaphore'를 만들려고했습니다. 혼란 스러울 수 있습니다. – JSlain
사실이 아닙니다. 정적 변수는 java의 메모리 모델에 의해 다르게 취급되지 않습니다. 스레드는 복사본을 가져오고 동기화 없이는 최신 업데이트에 대한 가시성이 보장되지 않습니다. – eldjon