class Account2{ int balance = 1000; public synchronized void withdraw(int money) { if(balance >= money) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } balance = balance - money; } } } class RunnableAccount implements Runnable{ Account2 acc = new Account2(); @Override public void run() { //1000 700 400 100 while(acc.balance > 0) { // 100, 200, 300중의 한 값을 임으로 선택해서 출금(withdraw) int money = (int) (Math.random() * 3 + 1) * 100; acc.withdraw(money); System.out.println("::balance:" + acc.balance); } } } class ThreadEx6 { public static void main(String[] args) throws Exception { Runnable r = new RunnableAccount(); Thread t1 = new Thread(r,"첫번째"); Thread t2 = new Thread(r,"두번째"); t1.start(); t2.start();
Thread는 동시에 돌기 때문에 예를 들어 balance가 300일 때 money가 둘다 200이라고 치면 두개가 동시에 들어가서 t1이 처리를 하기 전에 1초 묶이고 t2가 들어가서 1초 묶일 때 t1이 200을 빼고 나면 100이 되는데 그 이후 t2가 200을 빼면 -100이 나오는 결과를 초래하게 된다. 동시성 때문에 발생하는 일이다.
- 자바에서는 위 1번 문제와 같이, 동시에 값을 참조해 오류가 발생하는 것을 방지하기 위해 쓰레드를 동기화 해 동기화 대상에 한해 동시에 처리를 할 수 없도록 만든다. method 선언 시 method의 return type 앞에 synchronized 키워드를 붙여주므로써 동기화를 적용할 수 있다.
- 컴퓨터 네트워크를 통해 서로 통신하는 기능을 구현하는 것을 의미. 네트워킹은 클라이언트와 서버 간의 데이터 교환, 원격 제어, 파일 공유 등 다양한 기능을 수행할 수 있게 함
URL을 통해 웹 리소스에 접근하고 데이터를 읽고 쓸 수 있는 클래스입니다. URLConnection을 사용하여 HTTP를 포함한 다양한 프로토콜을 처리할 수 있습니다.
IP 주소를 표현하고 조작하기 위한 클래스입니다. DNS(Domain Name System) 조회를 통해 호스트 이름을 IP 주소로 변환하거나, IP 주소의 정보를 가져오는 등의 작업을 수행할 수 있습니다.
클라이언트와 서버 간의 연결을 위한 기본 클래스입니다. 서버용 소켓. ServerSocket을 사용하여 클라이언트의 연결 요청 수락하는 용도
클라이언트와 서버 간의 연결을 위한 기본 클래스입니다. 클라이언트용 소켓. 서버에 연결하기 위해 사용
통신 규약으로, 네트워크를 통해 통신하도록 규칙을 정해 놓은 것. 네트워킹에서 자주 사용되는 프로토콜로는 TCP/IP, HTTP, FTP, SMTP, POP3 등이 있음
- 상호 연결이 되어야 동작함.
- 신뢰성이 높음(확인 응답, 재전송, 순서 보장 등의 기능을 제공)
- 흐름 제어, 혼잡 제어를 위해 데이터 전송 속도를 조절하고 네트워크 혼잡을 방지
- 웹 브라우저, 이메일, 파일 전송 등 신뢰성이 중요한 애플리케이션에서 사용
- 연결 시에는 3-way handshake, 연결 종료 시에는 4-way handshake를 한다.
- 상대적으로 느림(그래도 빠름)
- 연결없어도 동작함
- 신뢰성이 낮음(응답, 재전송, 순서 보장 등의 기능이 없음)
- 연결이 없어도 동작하기 때문에 상대적으로 빠름
- 데이터 송신시 손실이 발생해도 괜찮은 스트리밍, 실시간 멀티미디어, DNS 등에서 사용
- 상대적으로 지연이 없음
- 3way handshake, 4way handshake