0

내가이 내 이해를 확인하려는 공유 -멀티 스레딩은 : 스레드 방식의 자신의 사본을 얻을 수 있지만, 매개 변수는

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 % 정확합니까? 누구든지 더 나은 단어를 넣으시겠습니까?

감사합니다.

답변

1

내가 올바르게 따라했는데 정확해야합니다.

스택과 힙의 기본적인 이해. 스택에서 선언 된 것 (함수에서 선언 된 변수)은 로컬에서만 사용할 수 있습니다. 힙에 선언 된 변수는 전역 적으로 또는 해당 범위 내의 모든 함수에 액세스 할 수 있습니다.

함수를 처리하는 스레드가있는 경우 함수 내의 모든 변수는 해당 함수 내에서만 액세스 할 수 있습니다. 그러나 전역 변수와 두 개의 스레드가 있으면 두 스레드가 해당 변수에 액세스 할 수 있습니다. catch는 변수에 쓰는 경우 서로 재정의하지 않도록해야한다는 것입니다.

하나의 스레드가 읽기/쓰기가 진행되는 동안 힙 변수를 잠그는 것이 솔루션입니다.

0

아래 코드를 실행하면 어떻게 될 것이라고 생각하십니까? 유사한 출력이 표시되지만 다른 순서로 표시됩니다. i은 정적 변수이며 정적 범위에 있으며 j은 메서드 범위에, kMain의 인스턴스 변수입니다. 스레드와 같은 것들. 스코프는 스레드와 동일하게 작동합니다. 대신 내부 클래스에 대해 읽어야합니다.

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() { 
     for (int i = 0; i < 4; i++) { 
      SingleProcessor sp = new SingleProcessor(); 
      sp.run(); 
     } 
    } 

    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(); 
     } 

    } 
} 
-1

네 말이 맞아.

정적 변수는 응용 프로그램에서 싱글 톤으로 intrepreted 될 수 있습니다. 스레드 수에 관계없이 항상 동일한 변수에 대한 참조를 갖습니다. 당신의 중첩 된 클래스가 당신에게 의미 필요홈페이지의 인스턴스가 SingleProcessor을 실체화 할 수 있도록를 고정하지 않기 때문에 인스턴스 변수 'K'에 관해서는

, 그것은에만 작동합니다. 인스턴스 인 SingleProcessor은 숨겨진 변수가 메인 인스턴스를 참조하는 숨겨진 변수를 갖습니다.

public class SingleProcessor implements Runnable { 

    private Main main; 

    public SingleProcessor(Main main){ 
     this.main = main; 
    } 

    @Override 
    public void run() { 
     System.out.println("single run starts" + Thread.currentThread().getName()); 
     Main.myStaticMethod(); 
     this.main.myInstanceMethod(); 
    } 

} 

을 그리고 당신의 SingleProcessor 같은 홈페이지 인스턴스의 모든을 제공 : 알맞은 값이 쓰기 것처럼 그것은 동일합니다.


이 모든 위험 스레드 변수를 다른 스레드가 수정되는 동시에 취득 할 수있다. 스레드 안전성에 대한 많은 고급 주제가 있습니다. 간단한 유형의 경우 Atomic 변수 인 Concurrency package JavaDoc을 사용할 수 있습니다.

+0

정적 변수를 싱글 톤과 비교하는 것은 좋은 생각이라고 생각하지 않습니다. 싱글 톤에 정적 변수가 사용된다는 사실은이를 수행하는 방법입니다. 고정 변수는 최종 변수가 아닌 경우 변경할 수 있습니다. 또한, 그 대답은 그 시점으로가는 것 같지 않습니다 (예 : stack vs heap에 대해 논의) –

+0

아마도, 나는 Singleton이라는 단어를 사용해서는 안됩니다. 나는 메모리에 동일한 참조가 모든 스레드에 의해 사용된다는 것을 보여주기 위해 'metaphore'를 만들려고했습니다. 혼란 스러울 수 있습니다. – JSlain

+0

사실이 아닙니다. 정적 변수는 java의 메모리 모델에 의해 다르게 취급되지 않습니다. 스레드는 복사본을 가져오고 동기화 없이는 최신 업데이트에 대한 가시성이 보장되지 않습니다. – eldjon