Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sun.misc.Unsafe란 (곽민주) #178

Open
MinjuKwak01 opened this issue Jun 26, 2024 · 0 comments
Open

sun.misc.Unsafe란 (곽민주) #178

MinjuKwak01 opened this issue Jun 26, 2024 · 0 comments

Comments

@MinjuKwak01
Copy link
Collaborator

문제가 무엇인가?

sun.misc.Unsafe 는 무엇일까?

왜 이런 문제를 선정하였는가?

스프링, 네티, 모키토 등 여러 라이브러리에서 sun.misc.Unsafe라는 클래스를 사용했다고 한다.

자신이 생각한 답변은 무엇인가?

Unsafe는 개발자가 Java 언어의 안전성 및 보안 모델을 우회하여 시스템 수준의 프로그래밍 작업을 수행할 수 있게 해준다.
Unsafe를 사용하여 성능을 극대화하거나 JVM의 일부 기능에 직접 접근해야할때 사용한다.
(메모리 관리, 객체 조작, 스레드 관리)

하지만 sun.misc.Unsafe는 잘못 사용하면 프로그램의 안전성과 안정성을 해칠 수 있다.
→ Java는 Unsafe 클래스의 인스턴스를 직접 생성하는 것을 막고 있다.

Unsafe 클래스는 private 생성자를 갖고 있어서 직접 인스턴스를 생성할 수 없다.
대신, getUnsafe()라는 정적 메소드를 제공하여 인스턴스를 반환한다.
그런데 getUnsafe() 메소드를 직접 호출하려고 하면 SecurityException이 발생한다. Unsafe 객체가 신뢰할 수 있는 코드에서만 사용되도록 하기 위해서

public static Unsafe getUnsafe() {
	Class cc = sun.reflect.Reflection.getCallerClass(2);
	if (cc.getClassLoader() != null)
		throw new SecurityException("Unsafe");
 
	return theUnsafe;
}

호출한 코드가 신뢰할 수 있는 코드인지 확인하는 과정을 거친다.

  • ClassLoader는 JVM시작 시 표준 라이브러리 클래스만 로드한다. 이 클래스들은 기본적으로 신뢰할 수 있다고 여겨진다.
    • 사용자가 작성한 코드, 외부 라이브러리 : 신뢰할 수 없는 코드
    • 사용자가 정의한 클래스는 ClassLoader애 의해 로드되므로 null이 아니다.
  • 따라서 표준 라이브러리 클래스만 Unsafe 인스턴스를 얻을 수 있도록 제한한다.

Java9부터는 Unsafe 클래스를 대신할 API들이 도입되었다 → Variable Handles, ByteBuffer

Variable Handles

  • 여러 스레드 간의 변수 접근을 동기화된 방식으로 처리할 수 있게 한다.
  • compareAndSet, getAndSet, getAndAdd와 같은 원자적 연산을 제공한다.
  • 배열 요소와 객체 필드에 대해 안전한 접근을 제공한다.

ByteBuffer

  • 직접 메모리 할당과 관리 기능을 제공한다.
  • 바이트 순서를 지정하여 플랫폼에 독립적인 방식으로 데이터를 저장할 수 있다.
  • IntBuffer, LongBuffer 등 다양한 기본 타입 버퍼로 변환할 수 있다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants