class Company { private int total = 0; public void add(String name, int revenue) { int tmp = total; System.out.println("司機:" + name+ " 查詢餘額:" + tmp); System.out.println("司機:" + name+ " 今日存入:" + revenue); tmp += revenue; System.out.println("公司:"+ "總共存款餘額:" + tmp); total = tmp; } } class Driver extends Thread { private Company comp; String name; public Driver(Company comp,String name){ this.comp = comp; this.name = name; } public void run() { for(int i=0; i < 3; i++){ try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } comp.add(name,100); } } } public class ThreadSynchronized { public static void main(String[] args) { Company comp = new Company(); Driver driver1 = new Driver(comp,"Driver1"); driver1.start(); Driver driver2 = new Driver(comp,"Driver2"); driver2.start(); } }執行結果,發生什麼錯誤?
這情況發生在當某個執行緒正在執行 add() 時,其他執行緒也正同時呼叫執行 add()。要避免此現象,必須在 add() 加入關鍵字 synchronized,這樣同步化之後就不會有資料相抵觸的情形發生。
class Company { private int total = 0; public synchronized void add(String name, int revenue) { int tmp = total; System.out.println("司機:" + name+ " 查詢餘額:" + tmp); System.out.println("司機:" + name+ " 今日存入:" + revenue); tmp += revenue; System.out.println("公司:"+ "總共存款餘額:" + tmp); total = tmp; } }執行結果
沒有留言:
張貼留言