1. 程式人生 > >《Java》Java“定時器和多執行緒”實際應用——執行緒同步

《Java》Java“定時器和多執行緒”實際應用——執行緒同步

一、任務目標

    將任務<Java“定時器和多執行緒”實際應用——定時器配合多執行緒>中的兩個執行緒修改為互斥的,以保證兩個執行緒不會同時對此類屬性x進行修改。

二、執行緒同步機制

    在Java中提供了同步機制,可以有效地防止資源衝突。同步機制使用 synchronized 關鍵字。關於 synchronized 關鍵字的使用有兩種方法:

  1. 同步塊
synchronized(Object){

}

    將共享資源的操作放置在 synchronized 定於的區域內,這樣當其他執行緒也取到這個鎖時,必須等待鎖被釋放時才能進入該區域。Object 為任意一個物件,每個物件都存在一個標誌位,並具有兩個值,分別為 0 和 1 。0 表明此同步塊中存線上程在執行,需要等待,當標誌位為 1 時,表明次同步塊中無執行緒執行,前來訪問次同步塊的執行緒可以執行同步塊中的內容。

  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 } }

執行結果:
在這裡插入圖片描述