Integer 자물쇠 만들기

1486 단어
병렬 프로그래밍을 할 때 대상 자물쇠는 피할 수 없는 문제입니다. 어떤 대상을 자물쇠로 사용할 수 있습니까?Java 구문의 경우 객체는 잠금으로 사용할 수 있지만 몇 가지 사항을 준수해야 합니다.
1 자물쇠가 비어있으면 안 된다. 즉, 자물쇠의 대상이 비어있으면 안 된다. 이런 오류는 쉽게 드러나 일반적으로 피할 수 있다.
2 자물쇠는final이어야 한다. 여기는 자물쇠로 사용할 대상의 인용을 반드시final로 명시해야 하는 것이 아니라 한 대상이 자물쇠로 사용할 경우 그 인용은 수정된 지향이 존재하지 말아야 한다. 그렇지 않으면 인용 지향이 바뀌고 대상 자물쇠도 바뀌며 자물쇠가 효과가 없을 수 있다.
두 번째에 대해 우리는 대상 자물쇠의 인용 성명을final로 표시하여 문제를 피할 수 있다.그 밖에 주의해야 할 것은 만약에 기본 데이터 형식의 봉인 유형, 예를 들어 Integer, Long 등 대상을 자물쇠로 사용할 때 반드시 매우 조심해야 한다. 이런 인용에 대한 값 부여 작업은 일부 상황에서(상량 탱크의 요소) 사실상 다시 가리키는 동작을 인용하면 자물쇠가 효력을 잃게 된다. 이때:
Integer i = 7;
... 과 같다
Integer i = new Integer(7);
i가 가리키는 대상을 인용하는 것은 새로운 대상입니다.
... 에 이르다
Integer i = 7;
Integer j = 7;
i와 j는 같은 대상입니까?윗글의 해석에 따르면 아니, 실제로 i와 j는 같은 대상이기 때문에 윗글의 묘사는 정확하지 않다.
JVM의 일부 최적화를 바탕으로 String 문자열 풀처럼 메모리를 절약하기 위해 JVM은 작은 범위 내의 Integer 값을 하나의 대상 풀에 넣을 수 있다. 이 범위는 -127~127(검증 대기)일 수 있다. 만약에 직접 값을 부여하는 방식으로 Integer 대상을 만들면 값도 대상 풀 범위 안에 있고 JVM은 대상 풀에서 대상을 직접 되돌려주고 메모리로 새로운 대상을 만들지 않는다.따라서 메모리를 절약하는 목적을 달성할 수 있다.
package com.dancen.test;

public class IntegerDemo
{
	public static void main(String[] args)
	{
		Integer a = 1000;
		Integer b = 1000;
		System.out.println(a == b);
		// false, 1000 JVM Integer 
		
		Integer c = 10;
		Integer d = 10;
		System.out.println(c == d);
		// true, Integer 
		
		Integer e = new Integer(10);
		Integer f = new Integer(10);
		System.out.println(e == f);
		// false, , 
	}
}

좋은 웹페이지 즐겨찾기