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/IfeMvehttp://www.cnblogs.com/redcreen/archive/2011/03/29/1998800.html
深入理解Java虚拟机
相关文章推荐
- Java并发与synchronized关键字
- Java 多线程并发编程之 Synchronized 关键字
- java并发编程之Synchronized关键字
- Java并发17:synchronized关键字的两种用法-同步代码块(4)和同步方法(2)
- Java并发18:Lock系列-Lock接口与synchronized关键字的比较
- synchronized关键字详解 --Java并发编程的艺术
- JAVA的synchronized关键字与concurrent并发包的性能比较。
- Java并发编程之同步关键字synchronized
- JAVA并发编程3_线程同步之synchronized关键字
- Java 多线程并发编程之 Synchronized 关键字
- Java并发之synchronized关键字
- Java并发之synchronized关键字
- Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
- Java 多线程并发编程之 Synchronized 关键字
- Java 多线程并发编程之 Synchronized 关键字
- 深入理解Java并发4——synchronized关键字
- 并发编程学习总结(七) :java中synchronized关键字使用详解(1)
- Java并发系列 1--线程基础与synchronized关键字
- JAVA并发编程3_线程同步之synchronized关键字
- Java基础加强之并发(四)synchronized关键字