Java 的锁

原创
2017/06/19 11:49
阅读数 6

对象头 Mark Word,用来描述对象的Hash 过期时间 年龄 垃圾回收标记  锁记录 线程ID所有信息 ,32位。

偏向锁:偏向于已经占有此线程的锁,默认启动 -XX:+UseBiasedLocking. 在竞争不激烈下提高性能。

Vector 线程安全,里面会走syncronised{} 性能有所下降 但是加上倾向锁 弥补性能缺口.

自旋锁:存在竞争时候,线程可以很快获取,不需要把线程挂起就可以获得锁,同步块尽量短,自旋成功率就提高了,节省线程 开始 和 释放 的操作时间,提高性能。Spinlocks

Summary: 试偏向锁,轻量级锁,都失败后尝试 自旋锁。失败后 尝试普通锁。

优化方法

  1. 尽量不要用syncronised 方法 可以在具体行家syncronised块 来减少锁持有时间。
  2. 大对象拆分成小对象,提高并行对,降低锁竞争,提高偏向锁和轻量级锁的成功率 eg: ConcurrentHashMap. Collections.syncronisedMap(Map) - > get() put() 有锁,内部分成多个小的Segment<K,V> 而不是一个大的。

锁分离:读锁 和 写锁 分离。

Eg: LinkedBlockingQueue put() 和 take() 互不影响。

无锁:锁是悲观的操作 无锁是乐观的操作。CAS(Compare and Swap), 非阻塞。

Eg: AtomicInteger, getAndSet(int Value) ,拿出来同时也set同步了,里面全是无锁操作 性能很高。

 

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部