웹 서버와 애플리케이션 사이에 데이터를 주고받는 규약
CGI 규칙에 따라서 만들어진 프로그램을 CGI 프로그램이라 한다.
대표적인 애플리케이션으로는 전자게시판, 접속 카운터, 위키, 블로그 시스템이 있다.
자바에서 웹 애플리케이션을 만드는 기술, 즉 자바에서 동적인 웹 페이지를 구현하기 위한 표준이다.
서블릿의 생성부터 소멸까지의 라이프사이클을 관리하는 역할을 가지고 있으며,
서블릿 컨테이너는 웹 서버와 소켓을 만들고 통신하는 과정을 대신 처리해준다.
그로인해 개발자는 비즈니스 로직에만 집중하면 되는 이점을 가지게 된다.
Thread safety 하지않다를 위한 코드
package org.example.counter;
public class Counter implements Runnable {
// 상태 유지를 하기위해 상대값을 설정
private int count = 0;
public void increment() {
count++;
}
public void decrement() {
count--;
}
public int getValue() {
return count;
}
@Override
public void run() {
this.increment();
System.out.println("Value for Thread After increment " + Thread.currentThread().getName() + " " + this.getValue());
this.decrement();
System.out.println("Value for Thread at last " + Thread.currentThread().getName() + " " + this.getValue());
}
}
package org.example.counter;
public class RaceConditionDemo {
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(counter, "Thread1");
Thread t2 = new Thread(counter, "Thread2");
Thread t3 = new Thread(counter, "Thread3");
t1.start();
t2.start();
t3.start();
}
}
Counter counter = new Counter(); Singleton 객체이며,
Thread t1 = new Thread(counter, "Thread1");
Thread t2 = new Thread(counter, "Thread2");
Thread t3 = new Thread(counter, "Thread3");
멀티쓰레드 환경에서 하나의 객체(자원)을 공유하게 되면
우리가 뜻하지않는 RaceCondition, 즉 뜻하지않는 결과를 반환할 수 있다.
RaceCondition 이란?
여러 프로세스 혹은 스레드가 하나의 자원에 동시에 접근하기위해 경쟁을 하면서 우리가 원하지않는 결과가 나올수 있다는 상황을 뜻한다.
main()
Value for Thread After increment Thread2 2
Value for Thread After increment Thread1 1
Value for Thread After increment Thread3 3
Value for Thread at last Thread2 2
Value for Thread at last Thread1 1
Value for Thread at last Thread3 0