在多线程开发中,总会遇到多个在不同线程中的方法操作同一个数据,这样在不同线程中操作这个数据不同的顺序
或者时机会导致各种不同的现象发生,以至于不能实现你预期的效果,不能实现一致性,这时候就能够使用
synchronizedkeyword对一个方法来说,这个synchronized能保证全部调用这种方法的线程仅仅有一个正在操作这种方法。
不会出现同一时候多个线程进入这种方法的情况,以下我们来一个样例说明这个情况。
首先是一个Account类,这个类模拟账户,提供添加工资和降低工资的方法,当然。这种方法是被synchronized控制
package com.bird.concursey.charpet2; public class Account { private double balance; public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public synchronized void addAmount(double amount) { double temp = balance; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } temp += amount; balance = temp; } public synchronized void subtractAmount(double amount) { double temp = balance; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } temp -= amount; balance = temp; } }
和保护的。
然后是两个模拟类,来模拟使用这个类来添加或者降低账户的剩余金额
package com.bird.concursey.charpet2; public class Bank implements Runnable { private Account account; public Bank(Account account) { this.account = account; } @Override public void run() { for(int i = 0; i < 100; i++) { account.subtractAmount(1000); } } }
package com.bird.concursey.charpet2; public class Company implements Runnable { private Account account; public Company(Account account) { this.account = account; } @Override public void run() { for(int i = 0; i < 100; i++) { account.addAmount(1000); } } public static void main(String[] args) { Account account = new Account(); account.setBalance(1000); Company company = new Company(account); Thread companyThread = new Thread(company); Bank bank = new Bank(account); Thread bankThread = new Thread(bank); System.out.printf("Account : Initial Balance: %f ",account.getBalance()); companyThread.start(); bankThread.start(); try { companyThread.join(); bankThread.join(); System.out.printf("Account : Final Balance: %f ",account.getBalance()); } catch (InterruptedException e) { e.printStackTrace(); } } }
这样不管怎么使用都能得到正确的结果