2017-12-21 4 views
0

를 사용하여, 나는 스택 감금에 대해 읽을 때 나는 좋은 느낌이 아주 잘 설명하기 때문에, 그러나이 문장은 나를 위해 몇 가지 의문이 제기 :스택 감금는 연습</em>에 내가 <em>자바 동시성 다음하고 지역의 객체 참조

을 객체 참조에 대한 유지 보수 스택 제한은 지시 대상이 탈출하지 않도록하기 위해 프로그래머는 조금 추가 지원을 필요로

사람이 O를 위반을 생산하기 위해 아래의 코드에서 뭔가를 할 수 f stack confinement? 현재는 감금 위반이 없다고 생각합니다. 로컬 객체 참조가 감금을 위반하는 방법을 알고 싶습니다.

/** 
* 
*/ 
package lession2.shared.object; 

/** 
* @author so_what 
*/ 
class Person { 
    private String personName; 
    private String personAddress; 

    public String getPersonName() { 
     return personName; 
    } 

    public void setPersonName(String personName) { 
     this.personName = personName; 
    } 

    public String getPersonAddress() { 
     return personAddress; 
    } 

    public void setPersonAddress(String personAddress) { 
     this.personAddress = personAddress; 
    } 

    @Override 
    public String toString() { 
     return "Person [personName=" + personName + ", personAddress=" + personAddress + "]"; 
    } 
} 

public class StackConfinement extends Thread { 

    public void setSomeMoreProperty() { 
     //this person object will be confined to each thread 
     Person person=new Person(); 
     person.setPersonAddress("NY"); 
     person.setPersonName("Xyz"); 
     //now I wan to pass this person to the other method 
     doSomething(person); 
     System.out.println(person); 
    } 

    public void doSomething(Person person) { 
     person.setPersonAddress("Canada"); 
     //can one add some thing here and violate the thread confinement 
    } 

    @Override 
    public void run() 
    { 
     setSomeMoreProperty(); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     StackConfinement thread1=new StackConfinement(); 
     StackConfinement thread2=new StackConfinement(); 
     thread1.start(); 
     thread2.start(); 
     thread1.join(); 
     thread2.join(); 
    } 

} 

답변

1

이 문장은 나를 위해 몇 가지 의문을 제기 : 객체 참조에 대한 스택 감금을 유지

는 지시 대상이 탈출하지 않도록하기 위해 프로그래머는 조금 추가 지원을 필요로

누구든지 아래 코드에서 스택 위반을 일으킬 수 있습니까? confineme NT?

물론. 이것이 괴물이 아니라면 Goetz . 처음에는 스택 감금에 시간을 소비하지 않았을 것입니다.

내 생각에는 현재 수거 제한이 없습니다. I 로컬 개체 참조가 제한을 위반할 수있는 방법을 알고 싶습니다.

로컬 변수에 저장된 참조는 스택 제한을 위반하지 않으며이 책에서는 로컬 변수를 통해서만 객체에 접근 할 수있는 상황을 정의합니다. 이 문제는 좀 더 광범위하게 도달 할 수있는 객체에 대한 (노터) 참조가있을 때 발생합니다. 예를 들어, 어떤 클래스의 정적 필드에 객체에 대한 참조를 저장하면 이런 일이 발생합니다. 또한 자체적으로 스택되지 않는 컨테이너에 객체에 대한 참조를 저장하는 경우에도 발생합니다.

이 책에서는 참조가 자체적으로 인 컨테이너에 저장되어 있지만 처음에는이지만 나중에 게시되는 경우를 더 자세히 보여줍니다. 객체는 (더 이상 스택에 제한되지 않는) 컨테이너에서 접근 할 수 있으므로 더 이상 스택 제한을받지 않습니다.

이 그대로 스택 제한 위반이 특정 코드에 도입 할 수있는 방법의 무한대이지만, 이것에 대해 어떻게 : 나는 실제로 그런이 생성 Person 객체를 넣어 같은 지속적인 영향을 StackConfinement.setSomeMoreProperty()을 만들고 싶었다 가정 List으로 즉,이과 같습니다

지금 people 멤버도 (예 : setSomeMoreProperty()에 의해 추가되는 person 등)가 참조하는 개체도 잘 좋은,하지만
public class StackConfinement extends Thread { 

    private List<Person> people = new ArrayList<>(); 

    public void setSomeMoreProperty() { 
     // Initially stack-confined 
     Person person = new Person(); 

     person.setPersonAddress("NY"); 
     person.setPersonName("Xyz"); 

     // does not break stack confinement: 
     doSomething(person); 
     System.out.println(person); 

     // this DOES break stack confinement: 
     people.add(person); 
    } 

    // ... 
} 

가 스택 제한됩니다.

+0

코드에 people.add (person) 행을 추가 할 때 발생할 수있는 문제의 유형을 알려주십시오. 그 객체가 올바르게 추가되지는 않지만 그 밖의 다른 것을 볼 수 있습니까? –

+0

@so_what, 그 메소드 (성공하면)는 당신이 물었던'person'에 대해 스택 감금을 위반하게 만든다. 'person'이 참조하는 객체가 로컬 변수가 아닌'StackConfinement' 객체의'people' 멤버를 통해 접근 할 수 있기 때문에 그 효과가 있습니다. 나는 그 점에 대한 답을 분명히했다. –

+0

네, 이제 사람 개체가 목록에 추가되었으므로이 개체는 다른 스레드에서 나중에 수정할 수 있으므로 제한되지 않습니다.이 목록이 내가 원하는 최종 출력 인 경우 문제가 발생하지 않습니다. 답을 고맙습니다. –