2012-02-09 2 views
0

이전 오브젝트를 다시 사용할 경우 (새로운 오브젝트의 인스턴스화를 피하기 위해) 오브젝트를 예약하기 위해 Pool 오브젝트를 작성하려고합니다. 나는 그 컴퓨터가 ArrayBlockingQueue이고 어떤 사람들은 그것을 사용하여 Pool을 만들었다. 하지만 모르는 한 가지 질문이 있습니다. 개체가 삽입 될 때 새 인스턴스를 다시 만듭니다. ArrayBlockingQueue<Integer> pool = new ArrayBlockingQueue<Integer>(3);ArrayBlockingQueue : 풀을 만들 때 사용해야합니까?

짧은 시간 후 : 예를 들어

pool = (3,4,5);

pool.take(5); ==> pool = (3,4); 
pool.put(6); ==>pool = (6,3,4); 

그래서, 내가 이전의 정수 객체에 6을 할당 궁금해 (과 값 5), 또는 Java 새로 만들 않으며, 그 값을 6으로 지정 하시겠습니까?

감사합니다 :)

+0

질문이 매우 불분명하여 제 생각에 편집을 권장했습니다. 나는 당신의 질문을 오해하지 않았 으면 좋겠다. – posdef

답변

1

ArrayBlockingQueue에는 매개 변수 유형의 배열이 있습니다. 그래서 내부적으로이 같은 보일 것이다 :

private void insert(E x) { 
    items[putIndex] = x; 
    putIndex = inc(putIndex); 
    ++count; 
    notEmpty.signal(); 
} 
: ArrayBlockingQueuesource code에 따르면

E[] items; 

Integer[] items; 

으로 귀하의 경우 인스턴스의 put 방법은 실제로 insert 메소드를 호출

pool.put(6)으로 전화하면 어떤 일이 발생합니까?입니다.6은 Integer 개체로 묶여이 메서드로 전달됩니다 (E이 이제 Integer이므로).실제로 Integer의 새 인스턴스가 생성된다고 말하는 것이 안전합니다.

1

그 "캡슐"에 의해 자바 것입니다 것입니다, 당신은 기본이되는 구현에 대해 걱정하지 말아야 참조하십시오. 오라클 문서에 따르면, "put"은 실제로 요소를 꼬리에 "삽입"합니다. 그래서 "오래된 물건들"을 대체 할 수는 없습니다.

0

나는 값의 대체가이 경우 실제적 일 것이라고 심각하게 의심합니다. 게다가, 코드가 생성하고 엄청난 수의 객체를 지우지 않는 한 그러한 객체 풀의 맞춤 구현이 유용 할 지 확신하지 못합니다.

흥미로운 점은 질문에서 스레드 안전성이나 멀티 스레딩에 대해 언급하지 않았지만 이러한 태그를 사용한 것입니다. 그런 풀을 가지고 달성하고자하는 것이 정확히 무엇입니까? ArrayBlockingQueue은 하나 또는 여러 스레드가 객체를 제거하는 동안 객체에서 하나 또는 여러 스레드가 덤프되는 스레드 안전 수집을위한 것입니다. 객체가 대기열에서 필요하지만 객체가 없거나 객체가 추가되었지만 대기열에 용량이없는 경우 다른 동작을 제공하는 데는 몇 가지 메소드가 있습니다. javadoc을 확인하고 실제로 ArrayBlockingQueue인지 확인해야합니다.

0

새로운 개체가 바로 여기에 만들어진 :

pool.put(6); 

당신이 것을 변환 무엇 오토 박싱 생각하면 그것은 더 명백하다 :

pool.put(new Integer(6)); 

큐 둘은 생성되지도 이러한 개체, 그것을 저장을 재사용 당신이주는 것들.

관련 문제