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);
}
}
}
Runnable r = new RunnableAccount();
Thread t1 = new Thread(r,"첫번쨰");
Thread t2 = new Thread(r,"두번쨰");
t1.start();
t2.start();
}
}
}
synchronized : 동기화
마이너스가 되는 원인
멀티스레드의 문제점이 발견, balance(잔액) thread-safe가 되지 않았기 때문에 t1 스레드가 잔액을 삭감하기 전에
t2가 balance(잔액)에 접근해 삭감을 해버리고 다시 t1이 slee()에서 깨어나 balance(잔액) 을 삭감해버리기 때문에 잔액이 0 이하의 마이너스 값이 발생된다.
해결 방법 : synchronized 키워드를 리턴타입 앞에 붙여주면 된다.
t1스레드가 먼저 공유데이터나 메서드에 점유하고 있는 상태인 경우 block으로 처리하기 때문에 t1 이외의 스레드의 접근을 막는다.
t1스레드가 작업을 다 끝냈다면 .unblock으로 처리하여 t1 이외의 스레드의 접근을 허락
두 개 이상의 쓰레드가 공유하는 데이터에 대한 접근을 제어하는 기법
컴퓨터 네트워크를 통해 서로 통신하는 기능을 구현하는 것을 의미. 네트워킹은 클라이언트와 서버 간의 데이터 교환, 원격 제어, 파일 공유 등 다양한 기능을 수행할 수 있게 함
4. 아래의 객체를 설명하시오.
- URLConnetion : URL을 통해 웹 리소스에 접근하고 데이터를 읽고 쓰는 클래스
- InetAddress : IP 주소를 표현하고 조작하기 위한 클래스, DNS를 통해 IP주소 변환및 정보
- ServerSocket : 서버용 소켓. ServerSocket을 사용하여 클라이언트의 연결 수락
- Socket : 클라이언트용 소켓. 서버에 연결하기 위해 사용
통신 규약으로, 네트워크를 통해 통신하도록 규칙을 정해 놓은 것. 네트워킹에서 자주 사용되는 프로토콜로는 TCP/IP, HTTP, FTP, SMTP, POP3 등이 있음
TCP : 상호 연결이 되어야 동작함.
신뢰성이 높음(확인 응답, 재전송, 순서 보장 등의 기능을 제공)
흐름 제어, 혼잡 제어를 위해 데이터 전송 속도를 조절하고 네트워크 혼잡을 방지
웹 브라우저, 이메일, 파일 전송 등 신뢰성이 중요한 애플리케이션에서 사용
연결 시에는 3-way handshake, 연결 종료 시에는 4-way handshake를 한다.
상대적으로 느림(그래도 빠름)
UDP : 연결없어도 동작함
신뢰성이 낮음(응답, 재전송, 순서 보장 등의 기능이 없음)
연결이 없어도 동작하기 때문에 상대적으로 빠름
데이터 송신시 손실이 발생해도 괜찮은 스트리밍, 실시간 멀티미디어, DNS 등에서 사용
상대적으로 지연이 없음