/**
*
* @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();
}
}