ìŒ | ì | í | ì | 목 | êž | í |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- hikari cp ì€ì
- ìì
- ìí°ë ë³ì¢ ê°ë°ì
- ìí°ë ê°ë°ìíì¬
- enum ìì±ì ì ê·Œ ì íì
- ìë°
- Hikari Connection Pool
- index skip scan
- ìžë±ì€ì€íµì€ìº
- ìë°ììì°ë ë륌 ì¬ì©íë ìŽì
- ë¹ìŒê°ì²Žìì±
- mysql
- InnoDBìí€í ì²
- ìë°ì°ë ë
- Item6
- SVN
- ìžë±ì€íì€ìº
- mysqlìí€í ì²
- ë°ìŽí°ë² ìŽì€ê²©ëŠ¬ìì€
- effectiveJava
- builder null
- assert.notnull
- ë°ì©ë ì€êµìŽ
- ìŽíí°ëžìë°
- item15
- ììŽí 15
- index full scan
- ìëŒì€í±ìì¹ë©ìžì§ì©ë
- ìë°ìì
- ìë°ëŒìŽëžì€í°ë
- Today
- Total
âð»êž°ë¡íë ëžë¡ê·ž
Thread - ë©í°ì°ë ë íë¡ê·žëë° ë³žë¬ž
ìë° ëŒìŽëž ì€í°ë 10죌 ì°š - ë©í°ì€ë ë íë¡ê·žëë°
âìë°ìì ì€ë ë륌 ì¬ì©íë ìŽì ì ì€ë ë륌 ìì±íë ë°©ë²
íë¡ê·žëšìì ìŽë í ìì ì íêž° ìíŽìë íë¡ìžì€ê° ììëë©°, ëìì ì¬ë¬ ìŒì ì²ëŠ¬íêž° ìíŽ ì¬ë¬ ê°ì íë¡ìžì€ê° ììëë€. íì§ë§ íë¡ìžì€ íëê° ììëë €ë©Ž ë§ì ìì(ìœ 32MB ~ 64MB)ìŽ í ë¹ëë€. ê·žì ë°íŽ ì€ë ëë íëë¹ 1MB ì ë í ë¹ëë¯ë¡ ìë°ììë ì¬ë¬ ìì ì ì ì ìììŒë¡ ìì ì ìííêž° ìíŽ ì€ë ë륌 ì¬ì©íë€.
1. Process & Thread
íë¡ìžì€
- ëšìí ì€í ì€ìž íë¡ê·žëš, ì¬ì©ìê° ìì±í íë¡ê·žëšìŽ ìŽì첎ì ì ìíŽ ë©ëªšëŠ¬ ê³µê°ì í ë¹ë°ì ì€í ì€ìž ê²
- íë¡ìžì€ë íë¡ê·žëšìì ì¬ì©ëë ë°ìŽí°, ë©ëªšëŠ¬, ì€ë ëë¡ êµ¬ì±ëš
- ìµì íëì ì€ë ëë¡ êµ¬ì±ëìŽììŒë©° ë ê° ìŽììŒ ê²œì° ë©í° ì€ë ë íë¡ìžì€
ì€ë ë
- íë¡ìžì€ ëŽìì ì€ì ë¡ ìì ì ìííë 죌첎, ì€ì ì€íìŽ ëë ëšì, ì€ë ëê° 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ì ìí
ìë° 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 ìíê° ë ì ìë€.
|
TERMINATED | ì°ë ëì ìì ìŽ ì¢ ë£ë ìí |
5. Threadì ì°ì ìì
ì€ë ëë ì°ì ìì (priority)ëŒë ìì± ë©€ë² ë³ì륌 ê°ì§ë€.
Threadì ì°ì ìì륌 ë€ë¥Žê² ì§ì íì¬ í¹ì ì€ë ëê° ë ë§ì ìì ìê°ì ê°ëë¡ ì¡°ì ê°ë¥íë€.
int getPriority() //ì€ë ëì ì°ì ìì ë°í
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
íšì€íž ìº íŒì€ - ìë° ì¬ìžì íší€ì§ - ë°ìì¢ ê°ì¬ë
ìë°ì ì ì - ì€ë ë ì°žê³
ìë°ì ì - ì€ë ë ì°žê³
'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 |