多线程同步代代码块synchronized(this)和synchronized(obj)区别(售票小按例)

用售票小案例来示范:

      注意:票池是共用的,那么票数一定得是static的!多线程去票池拿票

 

1.1当用this来做监视器时(当前对象非static)

多次测试未出现数据重复。说明可以启动同步作用。

1.2.当我新增new Ticket对象,

多次测试出现t和tt重复买票。this未实现同步作用。

说明:this只是对当前对象实例有用,一旦有了新对象则失去效果。

2.1当我用全局变量obj来做监视器时,

多次测试出现重复买票问题。obj未实现同步作用。

2.2当我把obj设置成全局静态变量时

多次测试并未出现重复买票问题。静态全局变量实现同步。

最后,总结一下:

      当我们项目有关同步问题时,可以尝试使用synchronized(obj){}代码块。至于未为什么不直接在方法上加synchronized关键字,是因为这个时候整个方法都是同步的,影响效率。使用synchronized(obj){}代码块,别的线程是可以访问此方法的,只是对此代码块内同步。obj因为是全局静态的,获取的是类锁。对于this的话,就如我上面说的,在同一个对象实例的情况下是同步的,但是不是同一个对象实例则失去效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值