ꎀ늬 메뉎

✍🏻Ʞ록하는 랔로귞

Thread - 멀티쓰레드 프로귞래밍 볞묞

Language/Java

Thread - 멀티쓰레드 프로귞래밍

쩐시킎 2021. 1. 22. 18:16
728x90

자바 띌읎람 슀터디 10죌 ì°š - 멀티슀레드 í”„로귞래밍


❓자바에서 슀레드륌 사용하는 읎유와 슀레드륌 생성하는 방법

프로귞랚에서 ì–Žë– í•œ 작업을 하Ʞ 위핎서는 프로섞슀가 시작되며, 동시에 여러 음을 처늬하Ʞ 위핎 여러 개의 프로섞슀가 시작된닀. 하지만 프로섞슀 하나가 시작되렀멎 많은 자원(ì•œ 32MB ~ 64MB)읎 할당된닀. 귞에 반핮 슀레드는 하나당 1MB 정도 할당되므로 자바에서는 여러 작업을 적은 자원윌로 작업을 수행하Ʞ 위핎 슀레드륌 사용한닀.

1. Process & Thread

https://mohanma.com/difference-process-thread-java/

프로섞슀

  • 닚순히 싀행 쀑읞 프로귞랚, 사용자가 작성한 프로귞랚읎 욎영첎제에 의핎 메몚늬 공간을 할당받아 싀행 쀑읞 것
  • 프로섞슀는 프로귞랚에서 사용되는 데읎터, 메몚늬, 슀레드로 구성됚
  • 최소 하나의 슀레드로 구성되얎있윌며 두 개 읎상음 겜우 멀티 슀레드 프로섞슀

슀레드

  • 프로섞슀 낎에서 싀제로 작업을 수행하는 죌첎, 싀제 싀행읎 되는 닚위, 슀레드가 cpu륌 점유핎서 슀레드 작업 수행 ( 슀쌀쥎러에 의핎 cpu 점유 )
  • 몚든 프로섞슀에는 한 개 읎상의 슀레드가 졎재하여 작업 수행

비유하자멎 프로섞슀는 공장, 슀레드는 공장에서 음하는 음Ꟍ 비유하멎 읎핎가 빠륌 것 같닀.


2. Thread 생성 방법 - Thread 큎래슀와 Runnable 읞터페읎슀

두 가지 방법은 읞슀턎슀 생성 방법읎 닀륎닀.

2.1 읞터페읎슀 Runnable 구현

자바는 닀쀑 상속읎 허용되지 않윌므로 읎믞 닀륞 큎래슀륌 상속한 겜우 thread륌 생성하렀멎 runnable 읞터페읎슀륌 구현하여 Thread륌 생성한닀.

  1. Runnable 읞터페읎슀륌 구현한 큎래슀의 읞슀턎슀 생성

  2. 읞슀턎슀륌 Thread 생성자의 맀개변수로 제공한닀.

class AnyThread implements Runnable {
	public void run(){
  }

public static void main(String args[]) {
		AnyThread test = new AnyThread();     // Thread 큎래슀 객첎륌 생성하여
		Thread myThread = new Thread(test);   // 쓰레드의 타겟에 넣얎 사용
		myThread.start(); //싀행 방법은 start() 혞출
	}
}

2.2 Thread 큎래슀 상속

extends킀워드로는 하나의 큎래슀만 상속읎 가능

class AnyThread extends Thread {
	public void run(){
  }

public static void main(String args[]) {
		AnyThread test = new AnyThread();         
		test.start();
	}
}

→ 슀레드륌 통핎 작업하고 싶은 ë‚Žìš© run() 메서드에 구현

→ start() 메서드로 슀레드 시작

 

Thread의 싀행 - start()

슀레드 생성 후 start() 메서드로 슀레드륌 싀행시킚닀. 바로 싀행되는 것은 아니고 싀행 대Ʞ 상태였닀가 자Ʞ 찚례가 되었을 때 찚례로 싀행한닀. ( 싀행 순서는 os의 슀쌀쥎러에 의핎 결정된닀. )

한번 싀행읎 완료된 슀레드는 닀시 싀행읎 불가하닀.

닀시 싀행하렀멎 아래와 같읎 새로욎 슀레드륌 생성핎서 싀행핎알 한닀.

→ start()는 프로섞슀가 아닌 슀레드가 JVM에 추가되얎 싀행됚을 뜻한닀.

class AnyThread extends Thread {
	public void run(){
    
  }

public static void main(String args[]) {
	AnyThread test = new AnyThread();         
	test.start();
        
        test = = new AnyThread(); // 닀시 생성
        test.start();
 }	
}

 

♹ 슀레드륌 생성시킬 때 run() 메서드가 아닌 start() 메서드륌 혞출할까?

 

 


3. Single Thread & Multi Thread

싱Ꞁ 슀레드 프로귞래밍

슀레드 하나로 수행되는 프로귞래밍. 대표적읞 예시로 main메서도 하나로 수행되는 프로귞래밍읎닀.

 

멀티슀레드 프로귞래밍

동시에 여러 개의 슀레드가 수행되는 프로귞래밍

 

멀티슀레드 프로귞래밍의 겜우 여러 슀레드가 같은 프로섞슀 낎의 자원을 공유핎서 작업하므로, 서로의 작업에 영향을 쀄 수 있닀. 읎륌 방지하Ʞ 위핎 임계 영역(critical section), 띜(lock)읎띌는 개념읎 나왔닀.

 

슀레드는 각각의 작업공간(context)을 가진닀. ìŠ€ë ˆë“œë“€ìŽ 공유하는 자원읎 있는 겜우 race condition읎 발생, 자원의 영역을 critical section(임계 영역)읎띌 한닀. ë‘ 개의 슀레드가 동시에 접귌한닀멎 아래와 같은 겜우가 발생할 수 있닀.

 

예시) 슀레드 a가 두 개의 값을 더하는 작업 쀑읎었는데 슀레드 b가 동음한 공유자원을 빌는 연산윌로 였버 띌읎딩되얎 슀레드 a의 연산읎 묎시될 수 도 있닀.

 

임계 영역 (critical section)

두 개 읎상의 슀레드가 동시에 접귌하게 되는 늬소슀

critical section에 동시에 thread가 접귌하게 되멎 싀행결곌륌 볎장할 수 없음

슀레드 간의 순서륌 맞추는 동Ʞ화(synchronization)가 필요

잠ꞈ (lock) 

critical section에 접귌할 수 있는 슀레드는 한 개뿐윌로 제한하고 닀륞 슀레드가 접귌할 수없도록 제한하는 것


4. Thread의 상태

https://knpcode.com/java/multi-threading/thread-states-in-java-thread-life-cycle/

자바 doc에 나와있는 thread 상태 https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html

 

상태 섀명
NEW 쓰레드는 생성되었지만 아직 start()로 싀행되지 않은 상태
RUNNABLE start()메서드에 의핎 쓰레드 객첎가 혞출, 싀행쀑읎거나 싀행 가능한 상태
JVM에의핎 싀행되도록 예앜되었지만 CPU cycle을 얻Ʞ 전까지 싀행되지 않을수도있닀. 
BLOCKED 동Ʞ화 랔럭에 의핎서 음시정지된상태 ( lock읎 풀늎때까지 Ʞ닀늬는 상태 )
WAITING  쓰레드의 작업읎 종료되지않았지만 싀행가능하지 않은 상태, 음시정지한 상태 
Object.wait(), Thread.join(), sleep 메서드등에의핎 WAITING 상태가 됚
TIME_WAITING 셋팅된 시간만큌 대Ʞ쀑읞 상태, 읎와 같은 메서드에 의핎 TIME_WAITING 상태가 될 수 있닀.
  • Thread.sleep
  • Object.wait with timeout
  • Thread.join with timeout
  • LockSupport.parkNanos
  • LockSupport.parkUntil
TERMINATED 쓰레드의 작업읎 종료된 상태

5. Thread의 우선순위

슀레드는 우선순위 (priority)띌는 속성 멀버 변수륌 가진닀.

Thread의 우선순위륌 닀륎게 지정하여 특정 슀레드가 더 많은 작업 시간을 갖도록 조정 가능하닀.

https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#MAX_PRIORITY

int getPriority() //슀레드의 우선순위 반환

https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#MAX_PRIORITY

setPriority(int newPriority) 슀레드의 우선순위륌 지정한 값윌로 변겜

 

Thread.MIN_PRIORITY(=1) ~ Thread.MAX_PRIORITY(=10)

디폮튾 우선순위 : Thread.NORM_PRIORITY(=5)

Thread의 우선순위는 슀레드륌 생성한 슀레드로부터 상속받는 것! 

-> main 메서드륌 수행하는 슀레드는 priority(5) 읎므로 main 메서드 낎에서 생성하는 Thread는 자동적윌로 우선순위 5가 된닀.

우선순위가 높은 thread는 CPU륌 배분받을 확률읎 높음


6. Thread의 메서드

6.1 join 메서드

닀륞 슀레드의 작업을 Ʞ닀늰닀.

닀륞 슀레드의 결곌륌 볎고 진행핎알 하는 음읎 있는 겜우 join메서드 활용한닀.

아래 귞늌에서 join() 메서드륌 혞출한 슀레드가 non-runnable 상태가 된닀. thread2가 시작되고 thread2가 죜윌멎 thread1 작업을 닀시 수행하게 된닀.

join() 메서드에 시간을 섞팅하지 않는닀멎 Ʞ닀늬멎서 수행할 작업읎 몚두 끝날 때까지 Ʞ닀늰닀.

* sleep()와 찚읎점윌로 join()은 현재 슀레드가 아닌 특정 슀레드에만 적용되므로 static메서드가 아니닀.

package thread;

public class JoinTest extends Thread {

    int start;
    int end;
    int total;

    public JoinTest(int start, int end){
        this.start = start;
        this.end = end;
    }

    public void run(){
        int i;
        for (i=start; i<=end; i++){
            total += i;
        }

    }
    public static void main(String[] args) {

        JoinTest jt1 = new JoinTest(1,50);
        JoinTest jt2 = new JoinTest(51,100);

        jt1.start();
        jt2.start();

        int total = jt1.total + jt2.total;//여Ʞ서는 제대로 계산되지 않음
        System.out.println("jt1.total = "+ jt1.total);
        System.out.println("jt2.total = "+ jt2.total);//두개의 결곌값읎 같지 않은걎 join
        System.out.println(total);

    }
}

메읞 슀레드에서 작업되는 total계산읎 jt1, jt2슀레드의 작업읎 몚두 종료된 후가 아니므로 total의 값읎 읎상하닀.

아래 윔드는 메읞 슀레드에서 jt1, jt2 슀레드에 join을 걞었닀.

package thread;

public class JoinTest extends Thread {

    int start;
    int end;
    int total;

    public JoinTest(int start, int end){
        this.start = start;
        this.end = end;
    }

    public void run(){
        int i;
        for (i=start; i<=end; i++){
            total += i;
        }

    }
    public static void main(String[] args) {

        JoinTest jt1 = new JoinTest(1,50);
        JoinTest jt2 = new JoinTest(51,100);

        jt1.start();
        jt2.start();


        try {
            jt1.join();
            jt2.join();

            //main쓰레드가 jt1,jt2에 join을 걞었닀.
            //try-catch 랔럭읎 잠시 Ʞ닀렞닀가
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int total = jt1.total + jt2.total;//여Ʞ서는 제대로 계산되지 않음

        System.out.println("jt1.total = "+ jt1.total);
        System.out.println("jt2.total = "+ jt2.total);//여Ʞ서는 제대로 계

        System.out.println(total);

    }
}

6.2 wait() / notify() / notifyAll()

아래 메서드는 자바 최상읎 큎래슀읞 Object 큎래슀에 정의되얎있닀.

동Ʞ화 랔록 안에서만 사용읎 가능하닀.

wait()
늬소슀의 사용읎 유횚하지않을때 늬소슀 사용읎 가능할 때까지 thread가 lock을 반납하고 대Ʞ상태가 된닀.(non-runnable한 상태로 전환)
notify() wait()하고있는 thread쀑 임의의 쓰레드륌 꺠욎닀. (runnable한 상태로 변겜)
notifyAll() wait() 하고있는 몚든 thread륌 깚욎닀.
notify()볎닀 notifyAll() 을 권장한닀.
특정 thread륌 깚우는 제얎륌 할 수 없윌므로 몚두 깚욎 후 겜쟁시킚닀. 겜쟁 후 하나의 thread만 lock을 얻고 얻지 못한 thread는 닀시 wait() 상태가 된닀.

아래 윔드는 책읎띌는 자원은 한정적읞데 대여자가 많아 대Ʞ엎읎 생게을 때읎닀.

책읎 닀시 반납되었을 겜우 notifyAll()을 사용하여 thread가 깚얎나 겜쟁하여 책을 가젞가도록 한닀.

package thread;
import java.util.ArrayList;

class FastLibrary{
    public ArrayList<String> books = new ArrayList();

    public FastLibrary(){
        books.add("태백산맥1");
        books.add("태백산맥2");
        books.add("태백산맥3");
    }

    public synchronized String lendBook() throws InterruptedException {

        Thread t = Thread.currentThread();
        while(books.size() == 0) {//겜쟁 후 책읎 없윌멎 닀시 잠듀도록
            //책읎 듀얎올때까지 대Ʞ
            System.out.println(t.getName()+" waiting start");
            wait();
            System.out.println(t.getName()+" waiting stop");
        }
        String title = books.remove(0);

        System.out.println(t.getName() +":"+title+" lend");

        return title;

    }

    public synchronized void returnBook(String title){
        Thread t = Thread.currentThread();
        books.add(title);
        notifyAll();//몚든 슀레드가 깚얎나서 겜쟁하도록 공정하게
        System.out.println(t.getName() +":"+title+" return");

    }
}

class Student extends Thread{
    public void run(){
        try {
            String title = LibraryMain.library.lendBook();
            if(title == null) return;
            sleep(5000);
            LibraryMain.library.returnBook(title);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}


public class LibraryMain {

    public static FastLibrary library = new FastLibrary();//shared resource
    //늬소슀는 한정적읎고 늬소슀륌 쓞렀고하는 쓰레드는 많을 겜우

    public static void main(String[] args) {

        Student student1 = new Student();
        Student student2 = new Student();
        Student student3 = new Student();
        Student student4 = new Student();
        Student student5 = new Student();
        Student student6 = new Student();

        student1.start();
        student2.start();
        student3.start();
        student4.start();
        student5.start();
        student6.start();

    }
}

 


7. Main Thread

JVM에 의핎 자동윌로 생성된닀.

main메서드는 프로귞랚 싀행의 시작점

jvm에 프로귞랚을 싀행시킀멎서 main 슀레드륌 자동 생성하고 프로귞랚읎 싀행된닀.(main 슀레드)

package thread;

public class HelloWorldTest {
    public static void main(String[] args) {
        int[] num = {1,2,3};
        System.out.println(num[4]);
        System.out.println("Hello World");
    }
}

큎래슀륌 생성하고 main 메서드에서 배엎의 값을 출력하는 윔드륌 작성하였닀. 음부러 exception을 발생시킀고 현재 슀레드륌 확읞하였닀.

아래 화멎을 볎멎 슀레드의 읎늄읎 main 임을 확읞할 수 있닀.

JVM읎 메읞 슀레드륌 자동윌로 만듀지만  닀륞 슀레드처럌  슀레드 명칭을 수정할 수 있닀. 

package thread;

public class HelloWorldTest {
    public static void main(String[] args) {

        Thread obj = Thread.currentThread();//Thread객첎로 부터 현재 쓰레드 정볎 받Ʞ
        System.out.println("Name of thread : "+obj.getName());
        System.out.println("Priority of thread : "+obj.getPriority());

        obj.setName("Hello Main Thread");
        System.out.println("New Name of thread : "+ obj.getName());
        System.out.print("Hello World");
    }
}

닀륞 슀레드륌 생성한닀.

main 슀레드에서 닀륞 슀레드듀읎 생성되얎 마치 main슀레드의 자식 슀레드처럌 볌 수 있닀.

main 슀레드의 우선순위가 5읎므로 메읞 슀레드에서 생성된 슀레드도 동음하게 디폮튾 우선순위(5)륌 가지게 된닀.

데몬 슀레드

  • 데몬(Daemon)읎란 볎통 늬눅슀나 유닉슀 계엎의 욎영첎제에서 백귞띌욎드로 동작하는 프로귞랚을 말한닀. 윈도 계엎에서는 서비슀띌고 핹
  • 자바 프로귞랚 작성 시 백귞띌욎드에서 특별한 작업을 처늬하게 하는 용도로 사용한닀.
  • 음반 슀레드(main 등읎) 몚두 종료되멎 데몬 슀레드는 강제적윌로 자동 종료된닀.
  • 데몬 슀레드 예시 ) 가비지 컬렉터, 워드프로섞서의 자동 저장, 화멎 자동 갱신

→ 3쎈마닀 autoSave값을 확읞하여 자동 저장 메서드륌 혞출하도록 데몬 슀레드륌 생성하였닀.

package thread;

public class DaemonThreadTest implements Runnable{
    static boolean autoSave = false;

    public static void main(String[] args) {
        Thread t = new Thread(new DaemonThreadTest());
        t.setDaemon(true);//true로 섀정 시 데몬쓰레드로 섀정
        t.start();

        for (int i=1; i<=10; i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }

            System.out.println(i);
            if(i == 5){
                autoSave = true;
            }
        }
        System.out.println("프로귞랚을 종료합니닀.");
    }

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {

            }
                if(autoSave){
                    autoSave();
                }

        }
    }

    public void autoSave() {
        System.out.println("작업파음읎 자동저장되었습니닀. ");
    }
}

데몬 슀레드 섀정은 start메서드볎닀 뚌저 수행되얎알 한닀. 만앜 뚌저 싀행되지 않윌멎 IllegalThreadStateException읎 발생한닀.

데몬 슀레드는 백귞띌욎드로 특별한 작업을 수행하는데 데몬을 섀정하는 것 자첎가 도욞 슀레드가 읎믞 시작한 뒀에 섀정하는 것은 말읎 되지 ì•Šêž° 때묞읞 것 같닀.

IllegalThreadStateException은 thread가 삎아있는지 확읞 후 죜얎있윌멎 exception을 날늰닀.

 

여Ʞ서 슀레드의 삎아있음 유묎는 시작되었는지와 아직 죜지 않은 상태륌 뜻한닀.


8. 동Ʞ화 ( Synchronized )

한 슀레드의 작업을 닀륞 슀레드가 간섭하지 못하게 막는 것을 동Ʞ화 ( ì˜ì—­ì— 대한 순서륌 지킀자 synchronization) 띌 한닀.

동Ʞ화륌 잘못 구현하멎 deadlock에 빠질 수 있닀.

synchronized 킀워드는 하나의 슀레드만 지정된 영역의 윔드륌 하나의 슀레드가 수행할 수 있도록 볎장하는 것읎닀.

 

아래 예제에서 동Ʞ화되지 않았을 때 ì–Žë–€ 현상읎 나타나는지 확읞하자.

class bank{//critical section 쉐얎는 되었지만 동Ʞ화가 되지 않았닀.
    private int money = 10000;
    
    public void saveMoney(int save){
        int m = getMoney();

        try {
            Thread.sleep(3000);//저축되는 시간
           
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setMoney(m+save);
    }

    public void minusMoney(int minus){
        int m = getMoney();

        try {
            Thread.sleep(200);//읞출되는 시간
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setMoney(m-minus);
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}

class park extends Thread{
    public void run() {    
        
        SyncTest.myBank.saveMoney(3000);
        System.out.println("save money : " + SyncTest.myBank.getMoney());

    }
}


class parkWife extends Thread{
    public void run() {
        SyncTest.myBank.minusMoney(1000);
        System.out.println("minus money : " + SyncTest.myBank.getMoney());
    }
    //읎 run메서드아래에서 띜을 걞 겜우 save가 ë‹€ 완료되고나서 minus가 수행된닀
}


public class SyncTest  {

    public static bank myBank = new bank();

    public static void main(String[] args)throws InterruptedException {

        park p = new park();
        p.start();
        //뚌저음을 시작한 사람읎 park씚 읎므로 park 씚의 음읎 끝날때까지 pw의 음은 시작되지 않음

        Thread.sleep(200);

        parkWife pw = new parkWife();
        pw.start();
    }

}

박 씚의 작업 슀레드(save)가 뚌저 싀행되얎 13000원읎 적ꞈ된 ë’€ 박 씚 와읎프의 작업 슀레드(minus)가 수행되얎 12000원의 잔고가 낚아있을 거띌 예상되었지만 수행 결곌는 달랐닀.

읎는 접귌하는 늬소슀에 대한 동Ʞ화( 자원에 접귌하는 순서가 지쌜지는 것)가 되지 않아 위와 같은 결곌가 발생하였닀.

자바에서 동Ʞ화 구현 방식

1. synchronized ìˆ˜í–‰ë¬ž - 메서드 낎의 음부륌 임계 영역윌로 지정

객첎의 ì°žì¡° 변수는 lock을 걞고자 하는 객첎륌 ì°žì¡°

synchronized(객첎의 찞조변수){
 // 찞조형 수식에 핎당되는 객첎에 lock륌 걎닀.
}

[예제]

package thread;

class bank{
    private int money = 10000;

    public void saveMoney(int save){
        int m = getMoney();

        try {
            Thread.sleep(3000);
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setMoney(m+save);

    }

    public void minusMoney(int minus){
        int m = getMoney();

        try {
            Thread.sleep(200);//저축되는 시간
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setMoney(m-minus);
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}

class park extends Thread{
    public void run() {
       synchronized (SyncTest.myBank) {
        SyncTest.myBank.saveMoney(3000);
        System.out.println("save money : " + SyncTest.myBank.getMoney());
       }

    }
}


class parkWife extends Thread{
    public void run() {
        synchronized (SyncTest.myBank) {
        SyncTest.myBank.minusMoney(1000);
        System.out.println("minus money : " + SyncTest.myBank.getMoney());
    }
    }
}


public class SyncTest  {

    public static bank myBank = new bank();

    public static void main(String[] args)throws InterruptedException {

        park p = new park();
        p.start();
        Thread.sleep(200);

        parkWife pw = new parkWife();
        pw.start();
    }
}

 

2. synchronized 메서드 - 메서드 전첎륌 임계 영역윌로 지정

public synchronized void test(){
}

슀레드는 synchronized 메서드가 혞출된 시점부터 핎당 메서드가 포핚된 객첎의 lock을 얻얎 작업을 수행하닀가 메서드가 종료되멎 lock을 반환한닀.

 

임계 영역의 읞슀턎수 변수 ì ‘ê·Œ 제얎자는 왞부에서 접귌하지 못하도록 private로 ì„ ì–ží•Žì•Œ 한닀.

[예제]

package thread;

class bank{
    private int money = 10000;


    //메서드가 속한 객첎에 lock읎 걞늌, 읎 메서드가 수행될때는 닀륞 메서드가 bank 객첎에 접귌읎 불가핚
    public synchronized void saveMoney(int save){
        int m = getMoney();

        try {
            Thread.sleep(3000);
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setMoney(m+save);
 
    }

    public synchronized void minusMoney(int minus){
        int m = getMoney();

        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setMoney(m-minus);
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}

class park extends Thread{
    public void run() {
        SyncTest.myBank.saveMoney(3000);
        System.out.println("save money : " + SyncTest.myBank.getMoney());
    }
}


class parkWife extends Thread{
    public void run() {
        SyncTest.myBank.minusMoney(1000);
        System.out.println("minus money : " + SyncTest.myBank.getMoney());
    }
}


public class SyncTest  {

    public static bank myBank = new bank();

    public static void main(String[] args)throws InterruptedException {

        park p = new park();
        p.start();

        Thread.sleep(200);

        parkWife pw = new parkWife();
        pw.start();
    }

}


9. 데드띜 ( = 교착 상태 )

여러 슀레드가 같은 프로섞슀 낎에서 자원을 점유한 상태에서 서로 상대펞읎 점유한 자원을 사용하렀고 Ʞ닀늬느띌 작업의 진행읎 멈춘 상태

두 개 읎상의 슀레드가 서로 Ʞ닀늬는 상황

L1읎 ìž ê·žê³  풀늬렀멎 L2가 필요, L2을 ìž ê·žê³  풀렀멎 L1읎 필요하닀. 하지만 L1읎 잠겚있는 상태읎므로 묎Ʞ한윌로 대Ʞ 쀑읞 상태로 빠지게 된닀.

팚슀튞캠퍌슀 - 자바 올읞원 박은종 강사님

 

 


[ì°žê³ ]

www.javamadesoeasy.com/2015/03/thread-states-thread-life-cycle-in-java.html

javagoal.com/main-thread-in-java/ 

 

main thread in java and How does main thread in java - JavaGoal

How JVM works with main thread in java. Why it is exist in each class. Let's understand how the main thread works with thread scheduler

javagoal.com

팚슀튞 캠퍌슀 - 자바 올읞원 팚킀지 - 박은종 강사님

자바의 정석 - 슀레드 ì°žê³ 

자바의 신 - 슀레드 ì°žê³ 

programmers.co.kr/learn/courses/9/lessons/279

728x90
반응형

'Language > Java' 칎테고늬의 닀륞 Ꞁ

Annotation 애녞테읎션  (1) 2021.02.04
Enum  (0) 2021.01.28
예왞처늬  (0) 2021.01.14
[ JAVA ] 읞터페읎슀  (0) 2021.01.08
[ JAVA ] package  (0) 2021.01.01