线程并发3

问:什么是Monitor?
答:Monitor是每个java对象内置的,是实现sync的基础。Sync 加锁实际上要获取到指定对象的Monitor,通过Monitor Enter指令获取,释放时通过Monitor Exit指令;

问:什么时候用sync,什么时候用lock?
答:lock支持状态判断和中断,sync不支持。需要公平锁那么只能用Lock。需要读写锁,也只能ReadWriteLock。

问:synchronized和ReentrantLock的性能对比?
答:ReentrantLock底层是AbstractQueuedSynchronized 悲观锁,它是cas实现自旋;sync由偏向锁–轻量锁—重量锁;偏向锁和轻量锁都是cas自旋的乐观锁,重量锁则不支持自旋且悲观。所以当竞争程度低,sync性能好一些;竞争程度高,ReentranLock性能好;

问:什么是自旋?
答:应对线程切换的开销时间大于实际锁的任务时间;
当持有锁的线程很快释放了锁,下一个线程马上会拿到锁,那么下一个线程就“等待”,这个等待就是自旋,而不是被cpu切换状态;

问:sync在1.6和1.7优化了什么?
答:
偏向锁 (自我乐观锁):是一种获取锁代价更低的方式,避免了同一线程反复获取锁的动作。当线程获取第一次获取偏向锁时,通过cas的方式锁对象的Mark word记录锁偏向的线程ID;后续不需要再通过cas的方式加锁和解锁,只需要判断是否有指向当前线程的偏向锁记录的线程ID,有的话则代表获取到了锁;其他线程企图竞争偏向锁时,才会释放这个偏向锁;

轻量级锁 (乐观锁):它认为对于大部分锁,在同步周期中不存在竞争,乐观性。所以它使用cas,避免了互斥的开销。加锁方式为, 线程栈中的lock record,cas方式更新锁对象的Mark Record指向lock record,指向成功则认为有轻量级锁;失败则认为发现了竞争,升级为重量级锁;

问:sync 升级过程?
答:当开始,没有线程持有锁,那么第一个线程会先使用偏向锁,认为它自己单独持有锁;第二个线程来, 发现了原线程使用了偏向锁,那么久升级为轻量级锁,这时会认为竞争程度很低;当自旋次数超过一定限制,或者有多个其他线程加重了竞争,那么升级为重量级锁;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值