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() {
//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 값을 확인하고 출금할 수 있는 금액이 있다고 판단한 후에 sleep을 호출하게 되면, 다른 스레드가 withdraw 메서드를 호출하여 balance 값을 변경할 수 있습니다. 이 경우, 첫 번째 스레드가 sleep을 마치고 balance 값을 갱신할 때 출금한 금액보다 작은 값이 남을 수 있으므로 음수 값이 나올 수 있습니다.
자바에서 쓰레드 동기화는 공유 자원에 대한 접근을 제어하여 쓰레드가 예기치 않게 데이터를 변경하는 것을 방지하는 것입니다. 쓰레드 동기화를 사용하면 쓰레드가 공유 자원을 안전하게 사용할 수 있으며, 이는 프로그램의 안정성과 성능을 향상시킵니다.
자바에서 쓰레드 동기화를 구현하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법은 synchronized 키워드를 사용하는 것입니다. synchronized 키워드는 메서드 또는 블록을 동기화하여 한 번에 한 쓰레드만 해당 메서드 또는 블록에 액세스할 수 있도록 합니다.
다음은 synchronized 키워드를 사용하여 메서드를 동기화하는 예입니다.
public synchronized void myMethod() {
// 이 메서드는 한 번에 한 쓰레드만 액세스할 수 있습니다.
}
다음은 synchronized 키워드를 사용하여 블록을 동기화하는 예입니다.
synchronized (myObject) {
// 이 블록은 한 번에 한 쓰레드만 액세스할 수 있습니다.
}
자바에서 쓰레드 동기화를 사용하면 프로그램의 안정성과 성능을 향상시킬 수 있습니다. 그러나 쓰레드 동기화는 성능에 영향을 미칠 수 있으므로 필요한 경우에만 사용해야 합니다.
네트워킹(Networking)
은 컴퓨터나 기타 장치들이 서로 통신하여 데이터를 주고받는 것을 말합니다. 네트워킹은 여러 대의 컴퓨터 또는 장치들을 연결하여 정보를 공유하고 자원을 이용하는데 사용됩니다. 네트워킹을 통해 인터넷이나 로컬 네트워크를 통해 데이터를 전송하고, 클라이언트와 서버 사이의 통신, 원격 제어 등 다양한 기능을 구현할 수 있습니다.URLConnetion
: URL과의 연결을 나타내는 추상 클래스로, URL을 통해 원격 서버와의 통신을 담당합니다. 웹 페이지 요청, 파일 다운로드, 데이터 업로드 등에 사용될 수 있습니다.InetAddress
: IP 주소와 호스트명을 나타내는 클래스로, 네트워크 상에서 컴퓨터를 식별하는 데 사용됩니다. IP 주소를 통해 컴퓨터의 위치를 확인하거나 호스트명으로 IP 주소를 얻어올 수 있습니다ServerSocket
: 서버 측에서 클라이언트의 연결을 수락하는 역할을 담당하는 클래스입니다. 서버 소켓은 특정 포트에서 클라이언트의 연결 요청을 기다리며, 연결이 수락되면 해당 클라이언트와 통신할 수 있는 소켓을 생성합니다.Socket
: 클라이언트와 서버 간의 통신을 담당하는 클래스로, 클라이언트 소켓과 서버 소켓 간의 연결을 형성합니다. 클라이언트 소켓은 서버에 연결을 요청하고, 서버 소켓은 클라이언트의 연결 요청을 수락하여 양쪽 간의 데이터 교환을 가능하게 합니다.프로토콜(Protocol)
은 컴퓨터나 장치 사이에서 데이터 통신을 위해 약속된 규칙의 집합입니다. 프로토콜은 데이터를 어떻게 구조화하고 전송하는지, 통신 시작과 종료 방법, 오류 처리 등을 정의합니다. 네트워크에서는 다양한 프로토콜이 사용되며, 예를 들면 HTTP, FTP, TCP/IP, SMTP 등이 있습니다.TCP(Transmission Control Protocol)
와 UDP(User Datagram Protocol)
는 네트워크 통신을 위해 사용되는 두 가지 주요한 프로토콜입니다.TCP는 신뢰성이 높은 연결 지향형 프로토콜입니다. 데이터의 전송 순서를 보장하고, 손실된 데이터를 재전송하며, 중복된 데이터를 제거하여 신뢰성 있는 통신을 제공합니다. TCP는 연결 설정(3-way handshake) 후에 데이터를 안정적으로 전송하고, 연결 종료 과정(4-way handshake)을 거칩니다. 대부분의 웹 브라우저에서 사용되는 HTTP 프로토콜은 TCP 위에서 동작합니다.
UDP는 비연결형 프로토콜로, 데이터 전송에 대한 신뢰성을 보장하지 않습니다. 데이터 그램을 캡슐화하여 전송하며, 수신측에서는 패킷을 별도로 재조립하지 않고 독립적으로 처리합니다. UDP는 실시간 스트리밍, DNS(Domain Name System) 등에서 사용되며, TCP보다 속도가 빠르고 오버헤드가 적습니다. 하지만 데이터의 손실이나 중복, 순서 변경 등의 문제가 발생할 수 있습니다.