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();
여러 스레드가 동시에 접근할 수 있는 잠재적인 문제로 인해, withdraw 메소드의 동기화 처리를 통해 스레드 충돌을 방지하려고 하지만, 잠시 멈추는 동안 다른 스레드가 접근할 수 있는 시간 창을 만들어서 balance가 음수로 감소하는 문제가 발생함
: 자바에서 쓰레드 동기화는 여러 개의 스레드가 공유 자원을 안전하게 사용하고 조율하기 위해 사용되는 메커니즘
URLConnection
: URL을 통해 원격 리소스와의 연결을 관리하는 클래스
InetAddress
IP 주소와 호스트 이름에 대한 추상화된 표현을 제공하는 클래스
ServerSocket
: 서버 애플리케이션에서 클라이언트의 연결 요청을 수신하는 클래스
Socket
: 클라이언트와 서버 간의 네트워크 통신을 담당하는 클래스
: 통신규약 = 약속 = http, tcp, ip, ump, stmp, ftp,
(무선 : 5g, lte, 3g, CDMA)
TCP
UDP