java基礎:執行緒同步
一:先看程式
public class Timer1 {
private static int num = 0;
public void add(String name) {
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",你是第" + num + "個使用Timer的執行緒");
}
}
public class TestSync1 implements Runnable{
Timer1 timer = new Timer1();
@Override
public void run() {
timer.add(Thread.currentThread().getName());
}
public static void main(String[] args) {
TestSync1 test = new TestSync1();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.start();
t2.start();
}
}
看輸出結果:
Thread-0,你是第2個使用Timer的執行緒
Thread-1,你是第2個使用Timer的執行緒
結果明顯有問題:
這是因為兩個執行緒訪問的是同一個Timer物件,其中一個執行緒呼叫Timer的add方法時,num++,這個時候,另外一個執行緒也有可能呼叫add方法,num又++,然後執行緒1輸出,執行緒2輸出,輸出的是同一個num = 2
二:解決辦法
add方法上加上synchronized關鍵字:public synchronized void add(String name){
或者在timer內部,執行程式碼塊
synchronized(this){
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",你是第" + num + "個使用Timer的執行緒");
}
這兩種方法,道理是一個的,都是實現鎖定Timer物件。
相關文章
- Java 執行緒基礎Java執行緒
- java基礎:執行緒Java執行緒
- Java - 執行緒基礎Java執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- java - 多執行緒基礎Java執行緒
- 【Java基礎】:執行緒控制Java執行緒
- Java—多執行緒基礎Java執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- Java 多執行緒基礎(八)執行緒讓步Java執行緒
- Java—執行緒同步Java執行緒
- Java 基礎(十四)執行緒——下Java執行緒
- Java基礎之執行緒安全Java執行緒
- Java 多執行緒基礎 - CyclicBarrierJava執行緒
- Java多執行緒-基礎篇Java執行緒
- Java 基礎(十三)執行緒——上Java執行緒
- java執行緒程式設計(一):執行緒基礎(轉)Java執行緒程式設計
- java執行緒學習5——執行緒同步之同步方法Java執行緒
- Java執行緒:執行緒的同步與鎖Java執行緒
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- java基礎 關於執行緒安全Java執行緒
- 【JAVA】【面試】【基礎篇】- 執行緒、鎖Java面試執行緒
- Java基礎之執行緒那些事Java執行緒
- Java-基礎-執行緒入門Java執行緒
- JAVA_基礎多執行緒(一)Java執行緒
- JAVA多執行緒-基礎篇-synchronizedJava執行緒synchronized
- Java 多執行緒基礎(六)執行緒等待與喚醒Java執行緒
- 執行緒基礎執行緒
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- Java 多執行緒基礎(十一)執行緒優先順序和守護執行緒Java執行緒
- java基礎-多執行緒初步瞭解Java執行緒
- Java併發基礎(2)------執行緒池Java執行緒
- Java基礎之多執行緒程式設計Java執行緒程式設計
- JAVA多執行緒和併發基礎Java執行緒
- Java多執行緒程式設計基礎Java執行緒程式設計
- 【Java基礎】:執行緒的生命週期Java執行緒
- Java多執行緒-基礎及實現Java執行緒
- Java中的執行緒同步Java執行緒