《并发编程》--18.Java层锁的优化
来源:互联网 发布:数据库管理系统是 编辑:程序博客网 时间:2024/05/29 05:03
1 减少锁持有时间
public synchronized void syncMethod(){ othercode1(); mutextMethod(); othercode2(); }像上述代码这样,在进入方法前就要得到锁,其他线程就要在外面等待。
这里优化的一点在于,要减少其他线程等待的时间,所以,只用在有线程安全要求的程序上加锁
public void syncMethod(){ othercode1(); synchronized(this){ mutextMethod(); } othercode2(); }2 减小锁粒度
将大对象(这个对象可能会被很多线程访问),拆成小对象,大大增加并行度,降低锁竞争。降低了锁的竞争,偏向锁,轻量级锁成功率才会提高。
最最典型的减小锁粒度的案例就是ConcurrentHashMap。
3 锁分离
最常见的锁分离就是读写锁ReadWriteLock,根据功能进行分离成读锁和写锁,这样读读不互斥,读写互斥,写写互斥,即保证了线程安全,又提高了性能。
读写分离思想可以延伸,只要操作互不影响,锁就可以分离。
比如LinkedBlockingQueue 详情查看 《并发编程》--17.BlockingQueue解析
4 锁粗化
通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽量短,即在使用完公共资源后,应该立即释放锁。只有这样,等待在这个锁上的其他线程才能尽早的获得资源执行任务。但是,凡事都有一个度,如果对同一个锁不停的进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化 。
举个例子:
public void demoMethod(){ synchronized(lock){ //do sth. } //做其他不需要的同步的工作,但能很快执行完毕 synchronized(lock){ //do sth. } }这种情况,根据锁粗化的思想,应该合并
public void demoMethod(){ //整合成一次锁请求 synchronized(lock){ //do sth. //做其他不需要的同步的工作,但能很快执行完毕 } }public void demoMethod(){ //整合成一次锁请求 synchronized(lock){ //do sth. //做其他不需要的同步的工作,但能很快执行完毕 } }当然这是有前提的,前提就是中间的那些不需要同步的工作是很快执行完成的。
再举一个极端的例子:
for(int i=0;i<CIRCLE;i++){ synchronized(lock){ } }for(int i=0;i<CIRCLE;i++){ synchronized(lock){ } } //在一个循环内不同得获得锁。虽然JDK内部会对这个代码做些优化,但是还不如直接写成synchronized(lock){ for(int i=0;i<CIRCLE;i++){ } }synchronized(lock){ for(int i=0;i<CIRCLE;i++){ } }
当然如果有需求说,这样的循环太久,需要给其他线程不要等待太久,那只能写成上面那种。如果没有这样类似的需求,还是直接写成下面
那种比较好。
阅读全文
0 0
- 《并发编程》--18.Java层锁的优化
- Java并发编程的艺术(十三)——锁优化
- Java并发编程-正确理解volatile关键字的两层语义
- Java并发编程 -- 再论锁的问题 -- 无锁与锁优化
- Java并发编程(十二)——锁优化
- java并发编程--锁和并发的小总结
- Java并发编程-锁
- 《并发编程》--19.虚拟机内的锁优化
- JAVA并发编程--锁的分类
- 【并发】锁的优化
- 并发编程的Java抽象
- 并发编程的Java抽象
- JAVA并发编程的理解
- JAVA并发编程的理解
- Java并发编程的艺术
- java的并发编程学习
- Java并发编程的特性
- java并发编程的知识点
- jar包调用dll、lib等外部库文件解决办法
- 51NOD-1414 冰雕
- MySQL
- SpringBoot入门:(1)创建一个应用
- [笔记]利用Webhook实现coding上的代码自动部署到Centos7服务器上
- 《并发编程》--18.Java层锁的优化
- 不能看的基础框架
- build process
- es6新特性
- Linux进程间通信-命名管道
- 仿海报工厂效果的自定义View
- Android 弹性动画的三种实现方式
- Android Gradle高级用法,动态编译技术:Plugin Transform Javassist操作Class文件
- virtualbox虚拟的Linux机器发送文件到windows服务器