java中多线程编程中线程同步方法_java多线程编程(五)-线程同步

一:synchronized同步方法和synchronized同步代码块

1,sysnchronized修饰对象方法

public synchronized void excute()

a,被synchronized修饰的方法称为同步方法,同步方法所处的对象会被上同步锁,该方法未执行完成其它线程是无法调用执行同步方法的。

b,若对象中存在多个同步方法,当一个方法被某个线程调用执行时,其它线程不仅无法调用执行该同步方法,其它同步方法也无法被调用执行,因为带同步锁的是对象,不是方法。

2,sysnochronized修饰类方法

public synchronized static void excuteClass()

a,当一个方法同时被synchronized和static修饰时,个人称之为同步类方法。同步类方法有同步方法所有特性。

b,同步类方法是将方法所处的类对应的Class对象上锁,所以多个线程访问Class对象被上锁的类创建的不同对象的同步方法,也是相互影响的,必须执行完一个,另一个线程才能执行,因为上锁的是模板Class对象,而不是普通创建的对象。

3,sysnochronized代码块

sysnochronized(object){

//执行代码

.....

}

a,同步代码块是为object对象上同步锁,object可以为任何对象,所以也包括this关键字引用的对象。

b,方法中不是被synchronized代码块包裹的代码,是可以被多个线程同时访问的。

二:同步锁案例(取钱案例)

用两个线程调用同一个目标对象的取钱方法,如果取钱方法不加锁,则可能导致账户余额不同步或账户透支,不符合实际情况。

packagecom.thread.www;importjava.math.BigDecimal;//银行存款

classBank{

BigDecimal onlnbl= new BigDecimal(100L);public /*synchronized*/BigDecimal getCash(BigDecimal tranam){if(tranam.compareTo(onlnbl)>0){return new BigDecimal(-1);

}//休眠一段时间,放弃bank对象使用

try{

Thread.sleep(1);

}catch(InterruptedException e) {

e.printStackTrace();

}this.onlnbl = this.onlnbl.subtract(tranam);return this.onlnbl;

}

}//取钱线程

class PrimeRun6 implementsRunnable{

Bank bank;publicPrimeRun6(Bank bank) {this.bank =bank;

}

@Overridepublic voidrun() {//打印剩余金额

System.out.println(Thread.currentThread().getName()+" onlnbl="+bank.getCash(new BigDecimal(90L)));

}

}//测试类

public classTest6线程同步 {public static voidmain(String[] args) {

Bank bank= newBank();

PrimeRun6 peRun= newPrimeRun6(bank);newThread(peRun).start();newThread(peRun).start();

}

}/*** 结果可能为10,10 或10,-80 或-80,-80**/

参考资料:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值