《Java》Java“定時器和多執行緒”實際應用——執行緒同步
阿新 • • 發佈:2018-11-12
一、任務目標
將任務<Java“定時器和多執行緒”實際應用——定時器配合多執行緒>中的兩個執行緒修改為互斥的,以保證兩個執行緒不會同時對此類屬性x進行修改。
二、執行緒同步機制
在Java中提供了同步機制,可以有效地防止資源衝突。同步機制使用 synchronized 關鍵字。關於 synchronized 關鍵字的使用有兩種方法:
- 同步塊
synchronized(Object){
}
將共享資源的操作放置在 synchronized 定於的區域內,這樣當其他執行緒也取到這個鎖時,必須等待鎖被釋放時才能進入該區域。Object 為任意一個物件,每個物件都存在一個標誌位,並具有兩個值,分別為 0 和 1 。0 表明此同步塊中存線上程在執行,需要等待,當標誌位為 1 時,表明次同步塊中無執行緒執行,前來訪問次同步塊的執行緒可以執行同步塊中的內容。
- 同步方法
synchronized void f(){
}
當某個物件呼叫了同步方法時,該物件上的其他方法必須等待該同步方法執行完畢後才能被執行。必須將每個能被訪問共享資源的方法修飾為 synchronized ,否則就會出錯。
三、程式碼實現
程式程式碼:
import java.lang.Thread; //匯入Thread類
import java.util.Timer; //匯入Timer類
import java.util.TimerTask; //匯入TimerTask類
public class ThreadSafeTest{ //建立ThreadSafeTest類
/**
* @param args
*/
static double x = 0; //定義雙精度型變數x
static boolean flag1 = false;
static boolean flag2 = false;
public synchronized static void add(){ //定義同步方法
if(flag1){
x += 1.0;
System.out.println("當前x的值為::"+x);
flag1 = false;
}
else if(flag2){
x += 0.1;
System.out.println ("當前x的值為::"+x);
flag2 = false;
}
}
public static class T1 extends Thread{ //指定T1繼承Thread類
public void run(){ //Thread的run()方法
Timer timer1 = new Timer(); //建立Timer類物件timer
timer1.schedule(new TimerTask(){ //schedule方法延遲300ms
public void run(){ //TimerTask類的run()方法
flag1 = true;
add();
}
},0,300);
}
}
public static class T2 extends Thread{
public void run(){
Timer timer2 = new Timer();
timer2.schedule(new TimerTask(){
public void run(){
flag2 = true;
add();
}
},0,400);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new T1().start(); //啟動執行緒T1
new T2().start(); //啟動執行緒T2
}
}
執行結果: