synchronized lock是java 解决并发问题常用的两种方式,都能保证同一时间只能有一个线程执行。他们的区别?
1.synchronized 可以修饰普通方法,代码块,静态类。lock 只能放在代码中。
2.synchronized 修饰,线程A在执行,则线程B一直等待,直到A释放锁,而ReentrantLock 则是在等待指定时间后中断。
3.synchronized 在jvm 层实现,只有代码执行完毕或出现异常才可退出,而ReentrantLock 是由代码实现,退出只能执行finanlly{} 里的unlock()。
4.竞争不是很激烈的情况下,synchronized效率高于ReentrantLock,反之成立。
5.lock 有读写锁和可重入锁(可重入读锁、可重入写锁、读锁升级写锁、写锁降级读锁),而synchronized没有
原理:
每个对象都有一个监视器(monitor),在线程进入monitor 时,会尝试获取monitor 的所有权,如果进入数为0,则获取锁,将进入数修改为1,即拥有该monitor 的所有权,如果进入数为1,则进入阻塞直到monitor 进入数为0.
网友评论