/** * * @author ZJC * * 前面所提到的线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时 *所需要的数据或方法,而不需要外部的资源或方法,也不必关心其他线程的状态或行为。 *但是经常有一些同时运行的线程需要共享数据,此时就要考虑其他线程的状态和行为了, *比如说我和B都去同一个窗口打饭,我肯定要知道B是否正在使用窗口啊,他使用完了我 *才可以用,或者我用完他用。这样才不会有冲突,保证结果正确。引入“互斥锁”的概念 *来解决这个问题。关键字synchronized来与对象的互斥锁联系。 当某个对象用 *synchronized修饰时,表明该对象在任一时刻只能用一个线程访问。 */ public class Synchronized_ { public static class Account{//账户类 public int money; Account(int x){money = x;} Account(){money = 0;} public void save(int i) { money += i; } public void get(int i) { money -= i; } public int ShowMoney() { return money; } } static class SaveMoney extends Thread{ public Account a; public int amount; SaveMoney(Account a1,int x){ a = a1; amount = x; } public void run(){ synchronized(a){ int now = a.ShowMoney(); a.save(amount); System.out.println("现有"+now+"存入"+amount+"余额"+a.ShowMoney()); } } } static class GetMoney extends Thread{ public Account a; public int amount; GetMoney(Account a1,int x){ a = a1; amount = x; } public void run(){ synchronized(a){ int now = a.ShowMoney(); a.get(amount); System.out.println("现有"+now+"取出"+amount+"余额"+a.ShowMoney()); } } } public static void main(String[] args) { // TODO 自动生成的方法存根 Account my = new Account(1000); new SaveMoney(my,100).start(); new GetMoney(my,100).start(); new SaveMoney(my,200).start(); new SaveMoney(my,200).start(); new GetMoney(my,300).start(); new GetMoney(my,100).start(); } }
原文:http://blog.csdn.net/huiguimoyu/article/details/19835497