์†Œ๊ฐœ

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” Java์— ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Better Together: Java and the Thread class ๋ผ๋Š” ์ œ๋ชฉ์˜ ๋ฆฌ๋ทฐ์—์„œ ์ด์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ํŒŒํŠธ I โ€” ์‹คํ–‰ ์Šค๋ ˆ๋“œ . ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์„œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๊ณ  ์–ด๋–ค ๊ธฐ๋ณธ ๋„๊ตฌ๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  ํŒŒํŠธ II โ€” ๋™๊ธฐํ™” - 1

์ƒ์‚ฐํ•˜๋‹ค

Thread.yield() ๋Š” ๋‹นํ˜น์Šค๋Ÿฝ๊ณ  ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‚ด๋ ค๊ฐˆ ์Šค๋ ˆ๋“œ ๋Œ€๊ธฐ์—ด์ด ์žˆ๋‹ค๊ณ  ์“ฐ๋Š” ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์Šค๋ ˆ๋“œ๊ฐ€ "์‹คํ–‰ ์ค‘"์—์„œ "์‹คํ–‰ ๊ฐ€๋Šฅ"์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(์ด๋Ÿฌํ•œ ์ƒํƒœ ๊ฐ„์— ๊ตฌ๋ถ„์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ฆ‰ Java๋Š” ์ด๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ํ˜„์‹ค์€ ํ›จ์”ฌ ๋œ ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋” ๋‹จ์ˆœํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์„ค๋ช…์„œ ์— ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ - ๋™๊ธฐํ™” - 2๋ฒ„๊ทธ( JDK-6416721: (spec thread) Fix Thread.yield() javadoc )๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค . yield()์ฝ์–ด๋ณด๋ฉด ๋ถ„๋ช…ํ•˜๋‹ค.yield()๋ฉ”์†Œ๋“œ๋Š” ์‹ค์ œ๋กœ Java ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ์— ์ด ์Šค๋ ˆ๋“œ์— ๋” ์ ์€ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ถŒ์žฅ ์‚ฌํ•ญ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ, ์ฆ‰ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ถŒ์žฅ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์€ JVM์˜ ๊ตฌํ˜„ ๋ฐ ์šด์˜ ์ฒด์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ์š”์ธ๋“ค์— ๋”ฐ๋ผ์„œ๋„ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ˜ผ๋ž€์€ Java ์–ธ์–ด๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด ๋‹ค์‹œ ์ƒ๊ฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Java Thread.yield() ์†Œ๊ฐœ: ๊ฐœ์š”๋ฅผ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค .

์ž 

์Šค๋ ˆ๋“œ๋Š” ์‹คํ–‰ ์ค‘์— ํœด๋ฉด ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ์œ ํ˜•์ž…๋‹ˆ๋‹ค. Java ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” Java ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰ํ•˜๋Š” ์šด์˜ ์ฒด์ œ์—๋Š” ์ž์ฒด ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ์‹œ์ž‘ํ•  ์Šค๋ ˆ๋“œ์™€ ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” JVM์„ ํ†ตํ•ด์„œ๋งŒ Java ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์ด ์Šค์ผ€์ค„๋Ÿฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ๋˜๋Š” ๊ทธ๋…€๋Š” ์Šค์ผ€์ค„๋Ÿฌ์—๊ฒŒ ์ž ์‹œ ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Thread.sleep() ๋ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ž‘๋™ ๋ฐฉ์‹ ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . Windows ์šด์˜ ์ฒด์ œ์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Internals of Windows Thread . ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์ง์ ‘ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ž. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ ์ด๋ฆ„์˜ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค HelloWorldApp.java.

class HelloWorldApp {
    public static void main(String []args) {
        Runnable task = () -> {
            try {
                int secToWait = 1000 * 60;
                Thread.currentThread().sleep(secToWait);
                System.out.println("Woke up");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        Thread thread = new Thread(task);
        thread.start();
    }
}
๋ณด์‹œ๋‹ค์‹œํ”ผ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ ํ›„ 60์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋Š” ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. " " ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•œ javac HelloWorldApp.java๋‹ค์Œ " java HelloWorldApp"์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ฐฝ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Windows์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. start java HelloWorldApp. ์šฐ๋ฆฌ๋Š” jps ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ PID(ํ”„๋กœ์„ธ์Šค ID)๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  "๋กœ ์Šค๋ ˆ๋“œ ๋ชฉ๋ก์„ ์—ฝ๋‹ˆ๋‹ค jvisualvm --openpid pid. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ โ€” ๋™๊ธฐํ™” - 3๋ณด์‹œ๋‹ค์‹œํ”ผ ์Šค๋ ˆ๋“œ๋Š” ์ด์ œ "Sleeping" ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋” ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์Šค๋ ˆ๋“œ๋Š” ๋‹ฌ์ฝคํ•œ ๊ฟˆ์„ ๊ฟ‰๋‹ˆ๋‹ค:

try {
	TimeUnit.SECONDS.sleep(60);
	System.out.println("Woke up");
} catch (InterruptedException e) {
	e.printStackTrace();
}
์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๊ณ„์…จ์Šต๋‹ˆ๊นŒ InterruptedException? ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ์‹œ๋‹ค.

์Šค๋ ˆ๋“œ.์ธํ„ฐ๋ŸฝํŠธ()

๋ฌธ์ œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ/์ˆ˜๋ฉด ์ค‘์ธ ๋™์•ˆ ๋ˆ„๊ตฐ๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ InterruptedException. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ, ์ฆ‰ ๊ตฌ์‹์ด๊ณ  ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์„ ์–ธ๋œ ํ›„์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค Thread.stop(). ๊ทธ ์ด์œ ๋Š” stop()๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ "์ข…๋ฃŒ"๋˜์–ด ๋งค์šฐ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์–ธ์ œ ์ค‘์ง€๋ ์ง€ ์•Œ ์ˆ˜ ์—†๊ณ  ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๋™์•ˆ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์Šค๋ ˆ๋“œ๋ฅผ ์ฃฝ์ด๋Š” ๊ฒƒ๋ณด๋‹ค Java์˜ ์ œ์ž‘์ž๋Š” ์ค‘๋‹จ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ๋…ผ๋ฆฌ์ ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด์— ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•˜๋Š๋ƒ๋Š” ์Šค๋ ˆ๋“œ ์ž์ฒด๊ฐ€ ๊ฒฐ์ •ํ•  ๋ฌธ์ œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Thread.stop์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.์˜ค๋ผํด ์›น์‚ฌ์ดํŠธ์—์„œ. ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public static void main(String []args) {
	Runnable task = () -> {
		try {
			TimeUnit.SECONDS.sleep(60);
		} catch (InterruptedException e) {
			System.out.println("Interrupted");
		}
	};
	Thread thread = new Thread(task);
	thread.start();
	thread.interrupt();
}
์ด ์˜ˆ์—์„œ๋Š” 60์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  "Interrupted"๋ฅผ ์ฆ‰์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. interrupt()์Šค๋ ˆ๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค . ์ด ๋ฉ”์„œ๋“œ๋Š” "์ธํ„ฐ๋ŸฝํŠธ ์ƒํƒœ"๋ผ๋Š” ๋‚ด๋ถ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ ์Šค๋ ˆ๋“œ์—๋Š” ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๋‚ด๋ถ€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด ํ”Œ๋ž˜๊ทธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์‹คํ–‰ ์ค‘์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ํŠน์ • ์‹œ๊ฐ„์— ์ž‘์—…์„ ๋๋‚ด๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

public static void main(String []args) {
	Runnable task = () -> {
		while(!Thread.currentThread().isInterrupted()) {
			// Do some work
		}
		System.out.println("Finished");
	};
	Thread thread = new Thread(task);
	thread.start();
	thread.interrupt();
}
์œ„์˜ ์˜ˆ์—์„œ while๋ฃจํ”„๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์™ธ๋ถ€์—์„œ ์ค‘๋‹จ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ ์— ๊ด€ํ•ด์„œ๋Š” isInterrupted์šฐ๋ฆฌ๊ฐ€ ๋ฅผ ์žก์œผ๋ฉด InterruptedExceptionisInterrupted ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žฌ์„ค์ •๋˜๊ณ  isInterrupted()false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Thread ํด๋ž˜์Šค ์—๋Š” ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—๋งŒ ์ ์šฉ๋˜๋Š” ์ •์  Thread.interrupted() ๋ฉ”์„œ๋“œ๋„ ์žˆ์ง€๋งŒ ์ด ๋ฉ”์„œ๋“œ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ false๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค! ์Šค๋ ˆ๋“œ ์ค‘๋‹จ ์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ์ด ์žฅ์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค .

์กฐ์ธ(๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ)

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์œ ํ˜•์˜ ๋Œ€๊ธฐ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

public static void main(String []args) throws InterruptedException {
	Runnable task = () -> {
		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			System.out.println("Interrupted");
		}
	};
	Thread thread = new Thread(task);
	thread.start();
	thread.join();
	System.out.println("Finished");
}
์ด ์˜ˆ์—์„œ ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” 5์ดˆ ๋™์•ˆ ํœด๋ฉด ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ์ฃผ ์Šค๋ ˆ๋“œ๋Š” ์ž ์ž๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚˜ ์ž‘์—…์„ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. JVisualVM์—์„œ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ - ๋™๊ธฐํ™” - 4๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๋•๋ถ„์— ์Šค๋ ˆ๋“œ์—์„œ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋Š” ํ˜ธ์ถœ๋œ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ด์•„์žˆ๋Š” ํ•œ join์‹คํ–‰๋˜๋Š” Java ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค . wait()์Šค๋ ˆ๋“œ๊ฐ€ ์ฃฝ์ž๋งˆ์ž(์ž‘์—…์ด ๋๋‚˜๋ฉด) ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋ฐฉ๋ฒ•์˜ ๋ชจ๋“  ๋งˆ๋ฒ•์ž…๋‹ˆ๋‹ค join(). ์ด์ œ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์œผ๋กœ ๋„˜์–ด ๊ฐ‘์‹œ๋‹ค.

๊ฐ์‹œ ์žฅ์น˜

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์—๋Š” ๋ชจ๋‹ˆํ„ฐ ๊ฐœ๋…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ผ๋Š” ๋‹จ์–ด๋Š” 16์„ธ๊ธฐ ๋ผํ‹ด์–ด๋ฅผ ํ†ตํ•ด ์˜์–ด๋กœ ์™”์œผ๋ฉฐ "๊ณผ์ •์„ ๊ด€์ฐฐ, ํ™•์ธ ๋˜๋Š” ์ง€์†์ ์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ ๋˜๋Š” ์žฅ์น˜"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์˜ ๋งฅ๋ฝ์—์„œ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋งํฌ๋œ ์ž๋ฃŒ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. JLS(Java Language Specification): 17.1๋กœ ์—ฌ์ •์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™” . ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ โ€” ๋™๊ธฐํ™” - 5Java๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด "๋ชจ๋‹ˆํ„ฐ" ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋Š” ๊ฐ ๊ฐœ์ฒด์™€ ์—ฐ๊ฒฐ๋˜๋ฉฐ ์Šค๋ ˆ๋“œ๋Š” ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ํš๋“ lock()ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค unlock(). ๋‹ค์Œ์œผ๋กœ Oracle ์›น ์‚ฌ์ดํŠธ์—์„œ ์ž์Šต์„œ Intrinsic Locks and Synchronization์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ์ด ์ž์Šต์„œ์—์„œ๋Š” Java์˜ ๋™๊ธฐํ™”๊ฐ€ ๊ณ ์œ  ์ž ๊ธˆ ๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ ์ž ๊ธˆ ์ด๋ผ๋Š” ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค . ์ด ์ž ๊ธˆ ์žฅ์น˜๋Š” ์ข…์ข… ๋‹จ์ˆœํžˆ " ๋ชจ๋‹ˆํ„ฐ "๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ Java์˜ ๋ชจ๋“  ๊ฐœ์ฒด์— ๊ณ ์œ ํ•œ ์ž ๊ธˆ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Java-Intrinsic Locks and Synchronization์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๋‹ค์Œ์œผ๋กœ Java์˜ ๊ฐœ์ฒด๋ฅผ ๋ชจ๋‹ˆํ„ฐ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Java์—์„œ ๊ฐ ๊ฐœ์ฒด์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ๊ฐ€์ƒ ๋จธ์‹ ์ด ๊ฐœ์ฒด์™€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‚ด๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ—ค๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ํ—ค๋”์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ "ํ‘œ์‹œ ๋‹จ์–ด"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ โ€” ๋™๊ธฐํ™” - 6

https://edu.netbeans.org/contrib/slides/java-overview-and-java-se6.pdf

๋‹ค์Œ์€ ๋งค์šฐ ์œ ์šฉํ•œ JavaWorld ๊ธฐ์‚ฌ์ž…๋‹ˆ๋‹ค. Java ๊ฐ€์ƒ ๋จธ์‹ ์ด ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• . ์ด ๋ฌธ์„œ๋Š” JDK ๋ฒ„๊ทธ ์ถ”์  ์‹œ์Šคํ…œ JDK-8183909 ๋ฌธ์ œ์˜ "์š”์•ฝ" ์„น์…˜์— ์žˆ๋Š” ์„ค๋ช…๊ณผ ๊ฒฐํ•ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . JEP-8183909 ์—์„œ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ Java์—์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ๊ฐœ์ฒด์™€ ์—ฐ๊ฒฐ๋˜๋ฉฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ธˆ์„ ํš๋“(๋˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ)ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public class HelloWorld{
    public static void main(String []args){
        Object object = new Object();
        synchronized(object) {
            System.out.println("Hello World");
        }
    }
}
์—ฌ๊ธฐ์„œ ํ˜„์žฌ ์Šค๋ ˆ๋“œ(์ด๋Ÿฌํ•œ ์ฝ”๋“œ ํ–‰์ด ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ)๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ synchronizedํ•˜์—ฌobject"\์ž ๊ธˆ์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ํš๋“ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ๊ฒฝํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(์ฆ‰, ๋™์ผํ•œ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์•„๋ฌด๋„ ์—†๋Š” ๊ฒฝ์šฐ) Java๋Š” "ํŽธํ–ฅ๋œ ์ž ๊ธˆ"์ด๋ผ๋Š” ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํƒœ๊ทธ์™€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ์˜ ์ž ๊ธˆ์„ ์†Œ์œ ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ž ๊ทธ๋Š” ๋ฐ ํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์ด์ „์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์†Œ์œ ๋œ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ž ๊ธˆ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JVM์€ ๋‹ค์Œ ์ž ๊ธˆ ์œ ํ˜•์ธ "๊ธฐ๋ณธ ์ž ๊ธˆ"์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. CAS(๋น„๊ต ๋ฐ ๊ตํ™˜) ์ž‘์—…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ ์ž์ฒด๋Š” ๋” ์ด์ƒ ๋งˆํฌ ์›Œ๋“œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋งˆํฌ ์›Œ๋“œ๊ฐ€ ์ €์žฅ๋œ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋ฉฐ JVM์ด ๊ธฐ๋ณธ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ๊ฒฝ์Ÿ(๊ฒฝํ•ฉ)ํ•˜๋Š” ๊ฒฝ์šฐ(ํ•˜๋‚˜๋Š” ์ž ๊ธˆ์„ ํš๋“ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋Š” ์ž ๊ธˆ์ด ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ) ๋งˆํฌ ์›Œ๋“œ์˜ ํƒœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋งˆํฌ ์›Œ๋“œ๋Š” ์ด์ œ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋กœ โ€” JVM์˜ ์ผ๋ถ€ ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์ž…๋‹ˆ๋‹ค. JDK Enchancement Proposal(JEP)์— ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ด ์—”ํ„ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ํž™ ์˜์—ญ์— ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ž ๊ธˆ์ด ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งˆํฌ ์›Œ๋“œ์˜ ํƒœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋งˆํฌ ์›Œ๋“œ๋Š” ์ด์ œ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐœ์ฒด(JVM์˜ ์ผ๋ถ€ ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ)๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. JDK Enchancement Proposal(JEP)์— ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ด ์—”ํ„ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ํž™ ์˜์—ญ์— ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ž ๊ธˆ์ด ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งˆํฌ ์›Œ๋“œ์˜ ํƒœ๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋งˆํฌ ์›Œ๋“œ๋Š” ์ด์ œ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐœ์ฒด(JVM์˜ ์ผ๋ถ€ ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ)๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. JDK Enchancement Proposal(JEP)์— ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ด ์—”ํ„ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ํž™ ์˜์—ญ์— ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆํฌ ์›Œ๋“œ๋Š” ์ด์ œ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐœ์ฒด(JVM์˜ ์ผ๋ถ€ ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ)๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. JDK Enchancement Proposal(JEP)์— ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ด ์—”ํ„ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ํž™ ์˜์—ญ์— ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆํฌ ์›Œ๋“œ๋Š” ์ด์ œ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐœ์ฒด(JVM์˜ ์ผ๋ถ€ ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ)๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. JDK Enchancement Proposal(JEP)์— ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ด ์—”ํ„ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ํž™ ์˜์—ญ์— ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ๊ฐœ์ฒด ํ—ค๋”์˜ ๋งˆํฌ ์›Œ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ˆํ„ฐ๋Š” ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. JVM์€ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„ ๊ฐ„์— ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ž ๊ธˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  ํŒŒํŠธ II โ€” ๋™๊ธฐํ™” - 7

๋™๊ธฐํ™”๋จ(์ž ๊ธˆ ๋Œ€๊ธฐ ์ค‘)

์•ž์—์„œ ๋ณด์•˜๋“ฏ์ด "๋™๊ธฐํ™” ๋ธ”๋ก"(๋˜๋Š” "์ž„๊ณ„ ์˜์—ญ")์˜ ๊ฐœ๋…์€ ๋ชจ๋‹ˆํ„ฐ์˜ ๊ฐœ๋…๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

public static void main(String[] args) throws InterruptedException {
	Object lock = new Object();

	Runnable task = () -> {
		synchronized(lock) {
			System.out.println("thread");
		}
	};

	Thread th1 = new Thread(task);
	th1.start();
	synchronized(lock) {
		for (int i = 0; i < 8; i++) {
			Thread.currentThread().sleep(1000);
			System.out.print(" " + i);
		}
		System.out.println(" ...");
	}
}
์—ฌ๊ธฐ์„œ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๋Š” ๋จผ์ € ์ž‘์—… ๊ฐ์ฒด๋ฅผ ์ƒˆ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์ „๋‹ฌํ•œ ํ›„ ์ฆ‰์‹œ ์ž ๊ธˆ์„ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ๊ธด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(8์ดˆ). synchronized์ด ๋ชจ๋“  ์‹œ๊ฐ„ ๋™์•ˆ ์ž‘์—…์€ ์ด๋ฏธ ์ž ๊ธˆ์„ ํš๋“ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋ก ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ธˆ์„ ์–ป์„ ์ˆ˜ ์—†์œผ๋ฉด ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ž ๊ธˆ์„ ํ™•๋ณดํ•˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ์ž ๊ธˆ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. JVisualVM์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ โ€” ๋™๊ธฐํ™” - 8JVisualVM์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ƒํƒœ๋Š” "๋ชจ๋‹ˆํ„ฐ"์ด๋ฉฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ๋˜์–ด ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒฐ์ •๋œ ์ƒํƒœ์˜ ์ด๋ฆ„์€ JVisualVM์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฆ„๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ,th1.getState()for ๋ฃจํ”„์˜ ๋ช…๋ น๋ฌธ์€ BLOCKED ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค . ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ฐ์ฒด์˜ ๋ชจ๋‹ˆํ„ฐ๋Š” ์Šค๋ ˆ๋“œ lock์— ์˜ํ•ด ์ ์œ ๋˜๊ณ  ์Šค๋ ˆ๋“œ๋Š” ์ฐจ๋‹จ๋˜์–ด ์ž ๊ธˆ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋œ ๋ธ”๋ก ์™ธ์—๋„ ์ „์ฒด ๋ถ„์„๋ฒ•์„ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค . mainth1HashTable

public synchronized int size() {
	return count;
}
์ด ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ž๋ฌผ์‡ ๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”? ์˜ˆ, ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ "์ด" ๊ฐœ์ฒด(ํ˜„์žฌ ๊ฐœ์ฒด)๊ฐ€ ์ž ๊ธˆ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋œ ๋ธ”๋ก ๋Œ€์‹  ๋™๊ธฐํ™”๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? . ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ ์ด๋ฉด ์ž ๊ธˆ์€ "this" ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ(์ •์  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ "this" ๊ฐœ์ฒด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—) Class ๊ฐœ์ฒด(์˜ˆ: )๊ฐ€ ๋ฉ๋‹ˆ๋‹ค Integer.class.

๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค(๋ชจ๋‹ˆํ„ฐ ๋Œ€๊ธฐ ์ค‘). notify() ๋ฐ notifyAll() ๋ฉ”์†Œ๋“œ

Thread ํด๋ž˜์Šค์—๋Š” ๋ชจ๋‹ˆํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ๋˜ ๋‹ค๋ฅธ ๋Œ€๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. sleep()๋ฐ ์™€ ๋‹ฌ๋ฆฌ join()์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ˆœํžˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด๋ฆ„์€ wait(). ์ด wait๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋‹ค๋ฆฌ๋ ค๋Š” ๋ชจ๋‹ˆํ„ฐ์™€ ์—ฐ๊ฒฐ๋œ ๊ฐœ์ฒด์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋ณด์ž:

public static void main(String []args) throws InterruptedException {
	    Object lock = new Object();
	    // The task object will wait until it is notified via lock
	    Runnable task = () -> {
	        synchronized(lock) {
	            try {
	                lock.wait();
	            } catch(InterruptedException e) {
	                System.out.println("interrupted");
	            }
	        }
	        // After we are notified, we will wait until we can acquire the lock
	        System.out.println("thread");
	    };
	    Thread taskThread = new Thread(task);
	    taskThread.start();
        // We sleep. Then we acquire the lock, notify, and release the lock
	    Thread.currentThread().sleep(3000);
	    System.out.println("main");
	    synchronized(lock) {
	        lock.notify();
	    }
}
JVisualVM์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  ํŒŒํŠธ II - ๋™๊ธฐํ™” - 10์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ ค๋ฉด wait()๋ฐ notify()๋ฉ”์„œ๋“œ๊ฐ€ ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค java.lang.Object. ์Šค๋ ˆ๋“œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๊ฐ€ Objectํด๋ž˜์Šค์— ์žˆ๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๊ทธ ์ด์œ ๊ฐ€ ๋ฐํ˜€์ง‘๋‹ˆ๋‹ค. Java์˜ ๋ชจ๋“  ๊ฐ์ฒด์—๋Š” ํ—ค๋”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ—ค๋”์—๋Š” ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ •๋ณด(์˜ˆ: ์ž ๊ธˆ ์ƒํƒœ)๋ฅผ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ด€๋ฆฌ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐœ์ฒด ๋˜๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๊ณ ์œ  ์ž ๊ธˆ ๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ผ๊ณ  ํ•˜๋Š” JVM์˜ ๋‚ด๋ถ€ ์—”ํ„ฐํ‹ฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ ์ž‘์—… ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๊ฐœ์ฒด์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•ด ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์„ ์ž…๋ ฅํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค lock. ์ด ๋ชจ๋‹ˆํ„ฐ์— ๋Œ€ํ•œ ์ž ๊ธˆ ํš๋“์— ์„ฑ๊ณตํ•˜๋ฉดwait()ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋Š” lock๊ฐœ์ฒด์˜ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ํ•ด์ œํ•˜์ง€๋งŒ ๊ฐœ์ฒด์˜ ๋ชจ๋‹ˆํ„ฐ์—์„œ ์•Œ๋ฆผ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ ๋Œ€๊ธฐ์—ด์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค lock. ์ด ์Šค๋ ˆ๋“œ ๋Œ€๊ธฐ์—ด์„ WAIT SET์ด๋ผ๊ณ  ํ•˜๋ฉฐ ๊ทธ ๋ชฉ์ ์„ ๋” ์ ์ ˆํ•˜๊ฒŒ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋Œ€๊ธฐ์—ด๋ณด๋‹ค ์ง‘ํ•ฉ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ main๋Š” ์ž‘์—… ๊ฐœ์ฒด๋กœ ์ƒˆ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹œ์ž‘ํ•˜๊ณ  3์ดˆ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋จผ์ € ์ž ๊ธˆ์„ ํš๋“ mainํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ ํ์— ๋“ค์–ด๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ main์Šค๋ ˆ๋“œ ์ž์ฒด๊ฐ€ ๊ฐœ์ฒด์˜ ๋™๊ธฐํ™” ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€ lock๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์•Œ๋ฆผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ์ด ์ „์†ก๋œ ํ›„ main์Šค๋ ˆ๋“œ๋Š”locklock๊ฐ์ฒด์˜ ๋ชจ๋‹ˆํ„ฐ์™€ ์ด์ „์— ๊ฐ์ฒด์˜ ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ํ•ด์ œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋˜ ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. notify()ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ( )์—๋งŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋Œ€๊ธฐ์—ด์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ( )์— ๋™์‹œ์— ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค notifyAll(). ์ž์„ธํ•œ ๋‚ด์šฉ์€ Java์—์„œ notify()์™€ notifyAll()์˜ ์ฐจ์ด์ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค . ์•Œ๋ฆผ ์ˆœ์„œ๋Š” JVM์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. notify ๋ฐ notifyAll์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์•„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? . ๊ฐœ์ฒด๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฝ”๋“œ ๋ธ”๋ก์ด ์•„๋‹Œ ์ „์ฒด ๋ฉ”์„œ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋  ๋•Œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .class์˜ˆ๋ฅผ ๋“ค์–ด, ์ •์  ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ์ž ๊ธˆ์€ Class ๊ฐœ์ฒด(๋ฅผ ํ†ตํ•ด ์–ป์Œ ) ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค .

public static synchronized void printA() {
	System.out.println("A");
}
public static void printB() {
	synchronized(HelloWorld.class) {
		System.out.println("B");
	}
}
์ž ๊ธˆ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ๋‘ ๋ฐฉ๋ฒ•์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. instance๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ํ˜„์žฌ , ์ฆ‰ ๋ฅผ ์‚ฌ์šฉ ํ•˜์—ฌ ๋™๊ธฐํ™”๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค this. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์šฐ๋ฆฌ๋Š” ์ด์ „์— ์ด getState()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€๊ธฐ์—ด์˜ ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๊ฐ€ wait()์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์ƒํƒœ๋Š” WAITING ๋˜๋Š” TIMED_WAITING์ด ๋ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  ํŒŒํŠธ II โ€” ๋™๊ธฐํ™” - 11

https://stackoverflow.com/questions/36425942/what-is-the-lifecycle-of-thread-in-java

์Šค๋ ˆ๋“œ ์ˆ˜๋ช… ์ฃผ๊ธฐ

์ˆ˜๋ช…์ด ๋‹คํ•˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ์ƒํƒœ๋Š” NEW์ž…๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” ์•„์ง ์‹คํ–‰ ์ค‘์ด ์•„๋‹ˆ๋ฉฐ Java ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์•„์ง ์ด์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๋ ค๋ฉด thread.start()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์Šค๋ ˆ๋“œ๋Š” RUNNABLE ์ƒํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—๋Š” "์‹คํ–‰ ๊ฐ€๋Šฅ" ์ƒํƒœ์™€ "์‹คํ–‰ ์ค‘" ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ž˜๋ชป๋œ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. Java๋Š” "์ž‘์—… ์ค€๋น„"(์‹คํ–‰ ๊ฐ€๋Šฅ)์™€ "์ž‘์—…"(์‹คํ–‰ ์ค‘)์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ์ด์ง€๋งŒ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ƒํƒœ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  • BLOCKED โ€” ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜, ์ฆ‰ synchronized๋ธ”๋ก์— ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐ ์ค‘์ž…๋‹ˆ๋‹ค.
  • WAITING โ€” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์ง€์ •๋œ ์‹œ๊ฐ„๊นŒ์ง€ ๋Œ€๊ธฐ ์ค‘์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์ƒํƒœ๋Š” TIMED_WAITING์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ๋” ์ด์ƒ ์‹คํ–‰ ์ค‘์ด ์•„๋‹ˆ๋ฉด(์™„๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ) TERMINATED ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด getState()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. isAlive()์Šค๋ ˆ๋“œ์—๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค .

LockSupport ๋ฐ ์Šค๋ ˆ๋“œ ํŒŒํ‚น

Java 1.6๋ถ€ํ„ฐ LockSupport ๋ผ๋Š” ํฅ๋ฏธ๋กœ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  ํŒŒํŠธ II โ€” ๋™๊ธฐํ™” - 12์ด ํด๋ž˜์Šค๋Š” "ํ—ˆ๊ฐ€"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ์Šค๋ ˆ๋“œ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ park()ํ—ˆ๊ฐ€๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜์–ด ํ”„๋กœ์„ธ์Šค์—์„œ ํ—ˆ๊ฐ€๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด unpark์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ—ˆ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ˆ๊ฐ€์ฆ์€ 1๊ฐœ๋ฟ์ด๋‹ค. ์— ๋Œ€ํ•œ Java ๋ฌธ์„œ๋Š” ํด๋ž˜์Šค๋ฅผ LockSupport์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค Semaphore. ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import java.util.concurrent.Semaphore;
public class HelloWorldApp{
    
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(0);
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            // Request the permit and wait until we get it
            e.printStackTrace();
        }
        System.out.println("Hello, World!");
    }
}
์ด์ œ ์„ธ๋งˆํฌ์–ด์— 0๊ฐœ์˜ ํ—ˆ๊ฐ€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  acquire()์ฝ”๋“œ์—์„œ ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด(์˜ˆ: ํ—ˆ๊ฐ€ ์š”์ฒญ) ์Šค๋ ˆ๋“œ๋Š” ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค InterruptedException. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์„ธ๋งˆํฌ์–ด๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. JVisualVM์„ ๋ณด๋ฉด ์ƒํƒœ๊ฐ€ "Wait"์ด ์•„๋‹ˆ๋ผ "Park"์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค.  2๋ถ€ โ€” ๋™๊ธฐํ™” - 13๋‹ค๋ฅธ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public static void main(String[] args) throws InterruptedException {
        Runnable task = () -> {
            // Park the current thread
            System.err.println("Will be Parked");
            LockSupport.park();
            // As soon as we are unparked, we will start to act
            System.err.println("Unparked");
        };
        Thread th = new Thread(task);
        th.start();
        Thread.currentThread().sleep(2000);
        System.err.println("Thread state: " + th.getState());
        
        LockSupport.unpark(th);
        Thread.currentThread().sleep(2000);
}
์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋Š” WAITING์ด์ง€๋งŒ JVisualVM์€ waitํ‚ค์›Œ๋“œ synchronized์™€ parkํด๋ž˜์Šค ๋ฅผ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค LockSupport. ์ด๊ฒƒ์ด ์™œ LockSupport๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ๊ฐ€์š”? Java ๋ฌธ์„œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์„œ WAITING ์Šค๋ ˆ๋“œ ์ƒํƒœ๋ฅผ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ, ๋“ค์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ์„ธ ๊ฐ€์ง€๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ wait()๋ฐ ์ž…๋‹ˆ๋‹ค join(). ๊ทธ๋ฆฌ๊ณ  ์„ธ ๋ฒˆ์งธ๋Š” LockSupport. Java์—์„œ ์ž ๊ธˆ์€ t์— ๊ตฌ์ถ•๋  ์ˆ˜ LockSuppor์žˆ์œผ๋ฉฐ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•ด ๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค ReentrantLock.

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class HelloWorld{

    public static void main(String []args) throws InterruptedException {
        Lock lock = new ReentrantLock();
        Runnable task = () -> {
            lock.lock();
            System.out.println("Thread");
            lock.unlock();
        };
        lock.lock();

        Thread th = new Thread(task);
        th.start();
        System.out.println("main");
        Thread.currentThread().sleep(2000);
        lock.unlock();
    }
}
์•ž์˜ ์˜ˆ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๊ธฐ์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด lock๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. JVisualVM์„ ๋ณด๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ main์ž ๊ธˆ์„ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ํŒŒํ‚น๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Java 8 StampedLocks ๋Œ€ ReadWriteLocks and Synchronized and Lock API in Java์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์„ ๋” ์ž˜ ์ดํ•ดํ•˜๋ ค๋ฉด Java Phaser ๊ฐ€์ด๋“œ ๋ฌธ์„œ์—์„œ Phaser์— ๋Œ€ํ•ด ์ฝ์–ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  ๋‹ค์–‘ํ•œ ๋™๊ธฐํ™” ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด The Java Synchronizers์— ๋Œ€ํ•œ DZone ๊ธฐ์‚ฌ๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

๊ฒฐ๋ก 

์ด ๋ฆฌ๋ทฐ์—์„œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ Java์—์„œ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์ฃผ์š” ๋ฐฉ์‹์„ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ž๋ฃŒ: ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค. 1๋ถ€ โ€” ์‹คํ–‰ ์Šค๋ ˆ๋“œ Java์™€ Thread ํด๋ž˜์Šค๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. 3๋ถ€ โ€” ์ƒํ˜ธ ์ž‘์šฉ ๋” ๋‚˜์€ ์กฐํ•ฉ: Java์™€ Thread ํด๋ž˜์Šค. 4๋ถ€ โ€” ํ˜ธ์ถœ ๊ฐ€๋Šฅ, ๋ฏธ๋ž˜ ๋ฐ ์นœ๊ตฌ ๋” ๋‚˜์€ ์กฐํ•ฉ: Java ๋ฐ Thread ํด๋ž˜์Šค. ํŒŒํŠธ V โ€” Executor, ThreadPool, Fork/Join ๋” ๋‚˜์€ ์กฐํ•ฉ: Java ๋ฐ Thread ํด๋ž˜์Šค. 6๋ถ€ โ€” ๋ฐœ์‚ฌ!