您的位置:首页 > 编程语言 > Java开发

Java并发(2) synchronized关键字

2016-10-26 01:20 302 查看

1. 用法

对于普通同步方法,锁是当前实例对象

对于静态同步方法,锁是当前类的Class对象

对于同步方法块,锁是synchronized括号里配置的对象

2. 底层实现方案

代码块同步使用monitorenter和monitorexit字节码,而monitorenter与monitorexit则是通过操作系统的mutex lock的lock()与unlock()方法

3. 锁优化

3.1. 锁优化的必要性

由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行,这种切换的代价是非常昂贵

在现实中的大部分情况下,同步方法是运行在单线程环境(无锁竞争环境)如果每次都调用Mutex Lock那么将严重的影响程序的性能。

3.2. 锁优化方式

偏向锁

轻量级锁

锁粗化:如果一系列的操作都对同一个对象反复加锁和解锁(甚至出现在循环体里),那即使没有线程竞争,频繁地进行互斥操作也会导致不必要的性能损耗。

锁消除:对一些代码上要求同步,但被检测到不可能存在共享数据竞争的锁进行消除

适应性自旋:为了让线程稍微等待一下,让线程执行一个忙循环(自旋)。如果锁被占用的时间很短,自旋等待的效果就会非常好。

4. 锁,对象,线程

Mark word:包含了对象hashCode、对象分代年龄、锁记录、锁拥有者(线程)。

线程获取对象锁的过程:执行monitorenter -> 为当前线程分配lock record空间(在Java栈) -> 将对象头中mark word的内容复制到lock record中 -> lock record指针与mark word进行CAS操作

5. synchronized与ReentrantLock

synchronized性能与ReentrantLock相差无几,如果不使用以下几种高级特性,则应该优先使用synchronized关键字

ReentrantLock中有公平锁

ReentrantLock中有定时中断(等待一定时间,如果获取不了锁就不等待了)

ReentrantLock中的Condition类,提供了signal与await方法,实现了Object的wait与notify方法

参考资料

http://www.tuicool.com/articles/IfeMve

http://www.cnblogs.com/redcreen/archive/2011/03/29/1998800.html

深入理解Java虚拟机
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: