用售票小案例来示范:
注意:票池是共用的,那么票数一定得是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的话,就如我上面说的,在同一个对象实例的情况下是同步的,但是不是同一个对象实例则失去效果。