同步方法和同步程式碼塊的區別
為何要使用同步? java允許多執行緒併發控制,當多個執行緒同時操作一個可共享的資源變數時(如資料的增刪改查), 將會導致資料不準確,相互之間產生衝突,因此加入同步鎖以避免在該執行緒沒有完成操作之前,被其他執行緒的呼叫, 從而保證了該變數的唯一性和準確性。 1.同步方法 即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 程式碼如: public synchronized void save(){} 注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會鎖住整個類 2.同步程式碼塊 即有synchronized關鍵字修飾的語句塊。 被該關鍵字修飾的語句塊會自動被加上內建鎖,從而實現同步 程式碼如: synchronized(object){ } 注:同步是一種高開銷的操作,因此應該儘量減少同步的內容。 通常沒有必要同步整個方法,使用synchronized程式碼塊同步關鍵程式碼即可。 程式碼例項:
/** * 執行緒同步的運用 * * @author XIEHEJUN * */ public class SynchronizedThread { class Bank { private int account = 100; public int getAccount() { return account; } /** * 用同步方法實現 * * @param money */ public synchronized void save(int money) { account += money; } /** * 用同步程式碼塊實現 * * @param money */ public void save1(int money) { synchronized (this) { account += money; } } } class NewThread implements Runnable { private Bank bank; public NewThread(Bank bank) { this.bank = bank; } @Override public void run() { for (int i = 0; i < 10; i++) { // bank.save1(10); bank.save(10); System.out.println(i + "賬戶餘額為:" + bank.getAccount()); } } } /** * 建立執行緒,呼叫內部類 */ public void useThread() { Bank bank = new Bank(); NewThread new_thread = new NewThread(bank); System.out.println("執行緒1"); Thread thread1 = new Thread(new_thread); thread1.start(); System.out.println("執行緒2"); Thread thread2 = new Thread(new_thread); thread2.start(); } public static void main(String[] args) { SynchronizedThread st = new SynchronizedThread(); st.useThread(); } } 3.使用重入鎖實現執行緒同步 在