这篇文章将为大家详细讲解有关Java锁的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强> Java锁的使用方法:强>
<强> 1锁的对象和范围强>
- <李>
缩小粒度
<强> 2锁的对象本身大小强>
- <李>
减少空间占用
原子长V。年代长
前者是个对象,包含对象头(对象头)以保存hashcode、锁等信息,64位系统下占16字节,64位系统下:
挥发性长=8字节
李> <李> AtomicLong=8个字节(挥发性)+ 16字节(对象头)+ 8个字节(引用)=32个字节
至少节约24字节!
所以原子*对象=凡ǘ饕嘈?静态原子* FieldUpdater
<强> 3锁的速度强>
提高并发性
<强> LongCounter 强>
记录内存分配字节数等功能用到的。
高并发下:java.util.concurrent.atomic。AtomicLong=比;java.util.concurrent.atomic。LongAdder
结论:及时衡量,使用JDK最新的功能
<强>根据不同情况,选择不同的并发包实现强>
JDK<1.8考虑ConcurrentHashMapV8 (ConcurrentHashMap在jDK8中的版本)
<强> 4不同场景选择不同的并发类强>
因需而变
- <李>
关闭和等待关闭事件执行器(事件执行者):
对象。等待/通知=稢ountDownLatch
Nio事件循环中负责存储的任务队列
Jdk的LinkedBlockingQueue (MPMC,多生产者多消费者)→jctools”MPSC
io.netty.util.internal.PlatformDependent.Mpsc # newMpscQueue (int):
<强> 5锁的价值强>
能不用则不用
网状的应用场景下:局部串行+整体并行祝辞——个队列+多个线程模式:
降低用户开发难度,逻辑简单,提升处理性能
避免锁带来的上下文切换和并发保护等额外开销
避免用锁:用ThreadLocal来避免资源争用,例如网状的轻量级的线程池实现