본문 바로가기

전체 글138

[자바] 원자적 연산, 동기화 자바는 멀티스레드 상황에서 안전하게 연산을 할 수 있도록 AtomicXxx 클래스들을 지원한다.먼저 Atomic이 아닌 int 값을 여러 스레드에서 ++하는 코드를 보도록 하자.public class Test { public static void main(String[] args) throws InterruptedException { IntTest intTest = new IntTest(0); System.out.println("연산 전 = " + intTest.getValue()); test(intTest); System.out.println("연산 후 = " + intTest.getValue()); } private static voi.. 2024. 12. 25.
[자바] Producer-Consumer Problem, BlockingQueue 생산자-소비자 문제란?여러 스레드가 동시에 데이터를 생산 및 소비할 때 생기는 동시성 문제생산자 : 데이터를 생산하는 역할 → 네트워크에서 데이터를 받아오거나, 파일을 읽는 스레드소비자 : 데이터를 소비하는 역할 → 얻어온 데이터를 처리, 저장하는 스레드버퍼 : 생산된 데이터가 일시적으로 저장되는 한정된 크기의 공간으로 데이터가 저장되면 소비자가 해당 버퍼에서 가져옴 (공유 자원)이해를 위해 다음 코드를 살펴보자.public class Buffet1 implements Buffet { private final Queue queue = new ArrayDeque(); private final int max; public Buffet1(int max) { this.max = ma.. 2024. 12. 25.
[자바] 동기화 락 공유 자원 → 여러 스레드가 접근할 수 있는 자원대표적으로 인스턴스의 필드(멤버 변수)에 여러 스레드가 접근할 수 있는데 이를 공유 자원이라 하고 이 때 공유 자원에 대한 접근을 적절하게 동기화해서 동시성 문제가 발생하지 않게 방지해야 한다.동시성 문제란어떠한 요청이 동시에 수행될 때 발생할 수 있는 문제로 동기화를 하지 않고 공유 자원에 접근하면 데이터의 일관성과 정합성을 해칠 수 있다. 코드로 동시성 문제에 대해 알아보도록 하자.public class ConcurrencyIssueMain { public static void main(String[] args) throws InterruptedException { Bank bank = new Bank(); DepositT.. 2024. 12. 25.
[자바] 메모리 가시성 메모리 가시성이란?멀티스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에 언제 반영되는지 알 수 없는 문제 다음과 같은 상황을 확인해보자.public class ThreadMain { public static void main(String[] args) throws InterruptedException { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable, "thread-1"); thread.start(); Thread.sleep(100); myRunnable.flag = false; thread.join(); Sys.. 2024. 12. 25.
[자바] 자바의 스레드 생명주기와 메서드 스레드의 생명주기스레드의 생명주기는 다음과 같다.스레드의 상태New : 스레드가 생성되었지만 아직 호출되지 않은 상태 (자바에서 start() 호출 전)Runnable : 스레드가 실행되기 위해 대기 중인 상태로 언제든 CPU를 할당받아 실행 준비가 되어있는 상태 (start() 호출, 자바에서는 스케줄러의 대기열에 존재하는 스레드나 실제 실행되는 스레드나 모두 Runnable 상태)Blocked : 스레드가 I/O와 같은 이벤트에 의해 대기하는 상태Terminated : 스레드 실행이 모두 끝나 종료된 상태. 더 이상 실행되지 않고 메모리에서 제거됨자바에서는 Blocked 상태가 다음과 같이 나뉜다.Blocked (차단) : 스레드가 동기화 락을 기다리는 상태 (synchronized 블록에 진입해야 .. 2024. 12. 25.
[자바] Iterable, Iterator, Comparable, Compartor Iterable, Iterator자바는 어떠한 자료 구조든 상관없이 동일한 순회 방법을 제공하기 위해 Iterable, Iterator 인터페이스를 제공한다. Iterable 인터페이스 내부에는 iterator() 메서드가 있다. 그리고 Iterator에는 hasNext(), next() 라는 메서드가 존재한다.public interface Iterable { Iterator iterator();}public interface Iterator { boolean hasNext(); // 다음 요소가 있는지 확인 E next(); //다음 요소를 반환}즉 Iterable 인터페이스는 컬렉션 인터페이스의 상위에 존재하여 자바의 컬렉션들이 Iterator를 구현하게 하기 위함이다. 그리고 .. 2024. 12. 24.
[자바] Object, Equals, Hashcode Object자바는 모든 클래스는 Object를 상속받는다. 즉 Object는 최상위 클래스임.이로 인해 모든 객체에 필요한 공통 기능 (equals, hashcode, toString …)을 제공하고 모든 객체에 대해 다형적 참조가 가능하여 다형성의 기본적인 매커니즘을 지원한다. 하지만 Object로 모든 객체를 다형적 참조한다면 Object 내부의 메서드만 사용할 수 있기 때문에 다운캐스팅을 해야한다는 단점이 존재한다.toString()Object 내에는 다음과 같이 toString() 메서드가 구현되어 있다.패키지 포함 객체 이름@16진수 해시값test.Member@30f39991 → src 하위의 test 패키지.클래스이름@해시코드public String toString() { retur.. 2024. 12. 24.
[자바] 제네릭 제네릭이란?특정 타입에 속하지 않고 일반적으로 사용된다는 의미로 클래스에서 사용될 타입을 외부에서 결정하도록 하여 타입에 대한 결정을 나중으로 미루는 것을 의미한다.제네릭을 사용하면 코드 재사용성을 올리며 타입 안전성까지 보장된다는 장점이 있다. 용어제네릭 클래스 : 다이아몬드 기호()를 사용한 클래스제네릭 타입 : 클래스, 인터페이스 정의 시에 타입 매개변수를 사용하는 것으로, 제네릭 클래스, 인터페이스를 뜻함.타입 매개변수 : 제네릭 타입, 메서드에서 사용되는 변수타입 인자 : 제네릭 타입에 실제로 제공되는 타입으로 기본형은 인자가 될 수 없음public class Generic { // T - 타입 매개변수 T data;}// Generic generic = new Generic() - 인자로 넘.. 2024. 12. 24.
[자바] Exception 자바는 프로그램 실행 시점에 발생할 수 있는 오류를 크게 두 가지로 분류하였다.Error → 메모리 부족이나 스택오버플로우와 같이 JVM, 하드웨어 등 시스템의 문제로 발생하는 것으로 개발자가 처리할 수 없는 것.Exception →RuntimeException → Exception 중 컴파일러가 예외를 체크하지 않으며, 실행 중 발생할 수 있고 예외 처리가 필수가 아니며, 언체크 예외라고도 불림.Checked Exception → 컴파일러가 예외를 체크하여 체크 예외라고함.또한 체크 예외에는 예외를 잡아서 복구할 수 있는 예외보다 복구할 수 없는 예외가 더 많다. (ex.. SQLException)반드시 예외 처리를 해야한다. 이 때 예외 처리 방법으로는 try-catch, throws와 같은 방법이 .. 2024. 12. 24.