1.아래의 소스코드에서 음수 값이 나오는 이유를 설명하시오.
class Account2{
int balance = 1000;
public 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() {
while(acc.balance > 0) {
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();
답변: 여러 스레드에서 동시에 withdraw() 메서드를 호출하는 경우, 잔액 확인(if(balance >= money))과 잔액에서 출금(balance = balance - money) 사이에 다른 스레드에 의한 출금이 발생할 수 있다. 이로 인해 잔액이 음수가 될 수 있다.
네트워크에서 데이터를 전송하기 위해서는 데이터를 일정한 형식으로 구성하고, 어떤 경로로 전송할지, 데이터의 정확성을 어떻게 보장할지, 데이터를 주고받을 때 어떤 규칙을 따를지 등을 결정해야 합니다. 이런 목적을 달성하기 위해 프로토콜이 사용된다.
프로토콜은 송신자와 수신자 간의 상호 작용을 정의하며, 데이터 전송의 다양한 측면을 다룬다.
TCP: 인터넷 프로토콜 스위트(IP Suite)의 핵심 프로토콜 중 하나로, 네트워크 상에서 데이터를 안정적으로 전송하기 위해 사용되는 연결 지향형 프로토콜이다.
UDP: 인터넷 프로토콜 스위트(IP Suite)의 하나로, 네트워크 상에서 데이터를 비신뢰적으로 전송하기 위해 사용되는 프로토콜이다. UDP는 TCP와 달리 연결 설정 과정이 없으며, 데이터 전송에 대한 확인이나 재전송을 보장하지 않는다. 이로 인해 TCP보다 더 낮은 오버헤드를 가지고 빠른 전송을 가능하게 한다.