java线程同步-synchronized

付费节点推荐


免费节点


节点使用教程


[t]什么是“线程同步” ?[/t]

所谓线程同步就是若干个线程都需要使用一个 synchronized(同步)修饰的方法,当一个线程使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到这个线程使用完该 synchronized 方法。

在下面的例子中有两个线程,会计和出纳,他俩共同拥有一个账本,她俩都可以使用saveOrTake(int amount)方法对账本进行访问,会计使用saveOrTake(int mount)方法时,向账本上写入存钱记录;出纳使用saveOrTake(int amount)向账本写入取钱记录。因此,当会计使用saveOrTake时,出纳被禁止使用,反之亦然。

[t]线程同步例子[/t]

/* Bank.java*/

package cn.bcoder;

public class Bank implements Runnable{ //实现Runnable接口
int money;
public void setMoney(int n){
money=n;
}

public void run() { //重写Runnbale接口中的abstract方法
if(Thread.currentThread().getName().equals("会计")) //获取当前线程的名字
saveOrTake(300); //调用synchronized修饰的方法,实现进程同步
else if(Thread.currentThread().getName().equals("出纳"))
saveOrTake(150);

}

public synchronized void saveOrTake(int amount) {
if(Thread.currentThread().getName().equals("会计"))
{
for(int i=0;i<=3;i++) //将所有的钱分三次存入
{
money=money+amount/3;
System.out.println(Thread.currentThread().getName()+"存入"+amount/3+",账上有"+money+"万,休息一下在存.");
try{
Thread.sleep(3000); //线程休眠3s
}
catch(InterruptedException e){ // 抛出异常

}
}

}
else if(Thread.currentThread().getName().equals("出纳"))
{
for(int i=0;i<=3;i++)
{
money=money-amount/3;
System.out.println(Thread.currentThread().getName()+"取出"+amount/3+",账上有"+money+"万,休息一下在取.");

try{
Thread.sleep(3000);
}
catch(InterruptedException e){
}
}
}
}

}

 

/*ThreadDemo.java*/

package cn.bcoder;

public class ThreadDemo{
public static void main(String args[]){
Bank bank=new Bank();
bank.setMoney(500);

Thread accountant; //会计线程
Thread cashier; //出纳线程

accountant=new Thread(bank);
cashier=new Thread(bank);
accountant.setName("会计"); //设置线程的名字
cashier.setName("出纳");

accountant.start(); //启动线程
cashier.start();

}
}

未经允许不得转载:Bcoder资源网 » java线程同步-synchronized

相关推荐

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册