java 从零开始,学习笔记之基础入门<线程及实例分析>(十九)(五)

2014-11-24 08:29:18 · 作者: · 浏览: 6
age com.ibm.wait;
public class QuitDemo extends Thread {
Account a; //账户
double money;//取钱数
public QuitDemo(Account a,double money){
this.a=a;
this.money=money;
}
public void run(){
//取钱
for(int i=0;i<20;i++){
a.selectMoney(money);
}
}
}
关键字synchronized :
来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
第一种SYN使用方法
package com.ibm.sync;
public class Test {
// synchronized关键字可以使线程在同一时刻只能有一个线程访问某一个方法或者对象
//用synchronizd的对象或者方法就类似于给方法在运行之前加了锁,只能有一个线程访问
//访问此方法当线程访问此方法结束时,那么此方法由被锁状态到解锁状态,那么其他的线程
//在锁被释放之后,才能够操作此方法
//在现实生活中一个银行账户A,在A中存放了1200块钱,那么我们在同一时刻分别对A账户用
//存折(线程一)和卡(线程二)取1000钱,那么启动线程的时候,调用取钱的方法,
//那么线程执行后,取出来的钱是2000
//一个人甲取钱,将用户名和密码正确输入,并且通过,表明甲在取钱之前的验证已经通过
//此时甲暂时离开,然后乙来了,也输入用户名和密码通过,甲乙两个人操作的账户是同一个账户
//乙取1000,甲回来了,甲也取1000,甲乙两个人一共取了2000,但是账户中只有1200,
//在现实生活中这种情况是不可能发生的,那么我们就应该对发生的这种情况进行控制,控制在调用
//取钱方法时,只能有一个线程调用,如果调用的这个线程没有结束,那么其他的线程都不能够
//访问这个方法.
public static void main(String[] args) {
//创建账户
CwAcount ca = new CwAcount("mm", 1200);
SbbDemo sd = new SbbDemo(ca, 1000);
sd.setName("mm存折 ");
sd.start();
SbbDemo sd2 = new SbbDemo(ca, 1000);
sd2.setName("mm卡 ");
sd2.start();
//对方法进行枷锁与对对象进行加锁实质上就是控制在同一时刻只能有一个线程
//访问方法或者对象,如果线程没有执行完,则其他线程处于等待状态,等待当前线程
//执行完之后在执行
}
}
package com.ibm.sync;
public class CwAcount {
private String acountno;
private double acountmoney;
public CwAcount(String acountno,double acountmoney){
this.acountno=acountno;
this.acountmoney=acountmoney;
}
//提供一个取钱的方法
//money表示你需要取的钱数
public synchronized void getMoney(double money)throws InterruptedException{
//取钱之前需要对账户的信息进行验证
if(acountmoney>=money){
Thread.sleep(1000);
acountmoney=acountmoney-money;
System.out.println(Thread.currentThread().getName()+"取钱成功,账户余额为:"+acountmoney);
}else{
System.out.println("不好意思多赚点钱了再来!");
}
}
}
package com.ibm.sync;
public class SbbDemo extends Thread{
CwAcount ca;
double money;
public SbbDemo(CwAcount ca ,double money){
this.ca=ca ;
this.money= money;
}
public void run(){
//执行取钱操作
try {
ca.getMoney(money);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
第二种SYN使用方法
package com.ibm.sync;
public class Test {
// synchronized关键字可以使线程在同一时刻只能有一个线程访问某一个方法或者对象
//用synchronizd的对象或者方法就类似于给方法在运行之前加了锁,只能有一个线程访问
//访问此方法当线程访问此方法结束时,那么此方法由被锁状态到解锁状态,那么其他的线程
//在锁被释放之后,才能够操作此方法
//在现实生活中一个银行账户A,在A中存放了1200块钱,那么我们在同一时刻分别对A账户用
//存折(线程一)和卡(线程二)取1000钱,那么启动线程的时候,调用取钱的方法,
//那么线程执行后,取出来的钱是2000
//一个人甲取钱,将用户名和密码正确输入,并且通过,表明甲在取钱之前的验证已经通过
//此时甲暂时离开,然后乙来了,也输入用户名和密码通过,甲乙两个人操作的账户是同一个账户
//乙取1000,甲回来了,甲也取1000,甲乙两个人一共取了2000,但是账户中只有1200,
//在现实生活中这种情况是不可能发生的,那么我们