반응형

thread 6

[Thread] Spinlcok

spinlockCAS는 단순한 연산 뿐만 아니라, synchronized, Lock(ReentrantLock) 없이 락을 구현하는데 사용할 수도 있다.스레드를 대기없이 lock을 구현하는 방법인데, 이를 spinlock이라고 한다.public class SpinLockBad { private volatile boolean lock = false; public void lock() { log("락 획득 시도"); while (true) { if (!lock) { // 락 사용 여부 확인 sleep(100); // 문제 상황 확인, 스레드 대기 lock = true; // 어떤 스레드가 락을 획득한 ..

Java 2024.09.08

[Thread] Lock, ReetrantLock

ReetrantLock자바 1.0부터 지원하기 시작한 synchronized와 BLOCKED 상태를 통한 임계 영역 관리의 한계를 극복하기 위해 자바 1.5부터 Lock 인터페이스, ReentrantLock 구현체를 제공한다. package java.util.concurrent.locks;import java.util.concurrent.TimeUnit;public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; vo..

Java 2024.09.07

[Thread] LockSupport

Lock supportLock support는 synchronized의 단점을 보완하기 위해 Java1.5부터 추가된 라이브러리 패키지다. synchronized의 단점은무한대기특정 시간까지만 대기하는 타임아웃X중간에 인터럽트X공정성락이 돌아왔을 때 BLOCKED 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할 지 알 수 없어서 특정 스레드는 오랜기간 동안 락을 획득하지 못할 수 있다.Lock Support의 기능LockSupport는 스레드를 WAITING 상태로 변경한다. WAITING 상태는 누군가가 다시 상태를 변경하지 않으면 계속 대기상태고 CPU 실행 스케줄링에 들어가지 않는다.park() : 스레드를 WAITING 상태로 변경한다.스레드를 대기 상태로 둔다. parkNanos(nanos..

Java 2024.09.06

[Thread] CAS 연산

CAS 연산lock 기반 방식(synchronized)의 문제점은 데이터를 보호하기 위해 락을 사용하게 된다. 락은 특정 자원을 보호하기 위해 스레드가 해당 자원에 대한 접근하는 것을 제한한다. 락이 걸려 있는 동안 다른 스레드들은 해당 자원에 접근할 수 없고, 락이 해제될 때까지 대기해야 한다. 그리고 락을 획득하고 반납하는 과정에서도 시간이 소요된다. 락이 있는지 확인한다.락을 획득하고 임계 영역에 들어간다.작업을 수행한다.락을 반납한다. 1억번의 연산을 수행한다면 4가지 과정을 반복하게 된다. 이러한 문제를 해결하기 위해 락을 걸지 않고 원자적인 연산을 수행할 수 있는 방법이 CAS(Compare-And-Swap, Compare-And-Set) 연산이라 하고, 락을 사용하지 않기 때문에 lock..

Java 2024.09.03

[Thread] Atomic, volatile, synchronized 성능 비교

원자적 연산원자적 연산은 중단되지 않고, 다른 연산과 간섭 없이 완전히 실행되거나 전혀 실행되지 않는 성질을 가지고 있다. 멀티 스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리되는 연산이라는 뜻이다. volatile int i = 0;// 원자적 연산 -> 여러 스레드가 접근해도 i에 값만 할당하니까 문제 없다.i = 1;// 원자적 연산이 아니다 -> 여러 스레드가 동시에 접근하면 문제가 생길 수 있다.i = i + 1; Java에서 제공하는 Atomic 객체 성능 비교BasicInteger -> 아무 키워드, 아무것도 사용하지 않고 int값을 증가 시킨다.VolatileInteger -> 메모리 가시성을 비교 하기 위해 int 변수에 Volatile 키워드만 추가하고 int 값을 증가시킨다...

Java 2024.09.03

[Thread] synchronized

synchronized멀티스레드를 사용할 때 가장 주의해야 할 점은, 같은 리소스에 여러 스레드가 동시에 접근할 때 발생하는 동시성 문제다. 여러 스레드가 접근하는 자원을 공유 자원이라 하고, 멀티스레드를 사용할 때는 이런 공유 자원에 대한 접근을 적절하게 동기화(synchronized)해서 동시성 문제가 발생하지 않게 방지 해야 한다.public class BankAccountV1 implements BankAccount { private int balance; public BankAccountV1(int initialBalance) { this.balance = initialBalance; } @Override public boolean withdraw(int ..

Java 2024.09.02
반응형