Java多线程编程 — 锁优化

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1240

阅读目录

一、尽量不要锁住方法

二、缩小同步代码块,只锁数据

三、锁中尽量不要再包含锁

四、将锁私有化,在内部管理锁

五、进行适当的锁分解

正文

并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问。加锁会带来性能上的损坏,似乎是众所周知的事情。然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程。【Redis实现的分布式锁和分布式限流】

如果只有一个线程竞争锁,此时并不存在多线程竞争的情况,那么JVM会进行优化,那么这时加锁带来的性能消耗基本可以忽略。因此,规范加锁的操作,优化锁的使用方法,避免不必要的线程竞争,不仅可以提高程序性能,也能避免不规范加锁可能造成线程死锁问题,提高程序健壮性。下面阐述几种锁优化的思路。

一、尽量不要锁住方法

在普通成员函数上加锁时,线程获得的是该方法所在对象的对象锁。此时整个对象都会被锁住。这也意味着,如果这个对象提供的多个同步方法是针对不同业务的,那么由于整个对象被锁住,一个业务业务在处理时,其他不相关的业务线程也必须wait。下面的例子展示了这种情况:

1240

 

1240


运行程序,可以看到在线程bussa 执行的过程中,bussb是不能够进入函数 busiB()的,因为此时lockMethod 的对象锁被线程bussa获取了。【Git内部原理之Git对象】

二、缩小同步代码块,只锁数据

有时候为了编程方便,有些人会synchnoized很大的一块代码,如果这个代码块中的某些操作与共享资源并不相关,那么应当把它们放到同步块外部,避免长时间的持有锁,造成其他线程一直处于等待状态。尤其是一些循环操作、同步I/O操作。

不止是在代码的行数范围上缩小同步块,在执行逻辑上,也应该缩小同步块,例如多加一些条件判断,符合条件的再进行同步,而不是同步之后再进行条件判断,尽量减少不必要的进入同步块的逻辑。

三、锁中尽量不要再包含锁

这种情况经常发生,线程在得到了A锁之后,在同步方法块中调用了另外对象的同步方法,获得了第二个锁,这样可能导致一个调用堆栈中有多把锁的请求,多线程情况下可能会出现很复杂、难以分析的异常情况,导致死锁的发生。下面的代码显示了这种情况:【Java 编程中关于异常处理的 10 个最佳实践】

1240


四、将锁私有化,在内部管理锁

把锁作为一个私有的对象,外部不能拿到这个对象,更安全一些。对象可能被其他线程直接进行加锁操作,此时线程便持有了该对象的对象锁,例如下面这种情况:

1240


这种使用方式下,对象a的对象锁被外部所持有,让这把锁在外部多个地方被使用是比较危险的,对代码的逻辑流程阅读也造成困扰。一种更好的方式是在类的内部自己管理锁,外部需要同步方案时,也是通过接口方式来提供同步操作:

1240


五、进行适当的锁分解

考虑下面这段程序:

1240


在这个例子中,join方法只使用一个同步锁,来获取tables中的List对象,然后判断玩家数量是不是小于9,如果是,就调增加一个玩家。当有成千上万个List存在tables中时,对tables锁的竞争将非常激烈。面【试中常问的List去重问题,你都答对了吗?】

在这里,我们可以考虑进行锁的分解:快速取出数据之后,对List对象进行加锁,让其他线程可快速竞争获得tables对象锁:

1240


扩展阅读

七点建议助您写出优雅的Java代码

实战经验分析,如何优雅地处理 Java 异常

SpringBoot (六) :如何优雅的使用 mybatis

程序员面试过程中,该怎么判断该公司好坏

如何在面试中介绍自己的项目经验

【面试现场】如何在10亿数中找出前1000大的数

来源:https://www.cnblogs.com/QG-whz/p/8351298.html

转载于:https://my.oschina.net/javafirst/blog/3043799

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Ap 开发 设计模式第六篇:原型模式

Prototype Pattern 名称由来 不是利用类来产生实例对象,而是从一个对象实例产生出另一个新的对象实例 ,根据被视为原型的对象实例 ,建立起的另一个新的对象实例就称为原型模式(Ptototype Pattern)。 需求场景 种类过多…

netty实现客户端服务端心跳重连

前言: 公司的加密机调度系统一直使用的是http请求调度的方式去调度,但是会出现网络故障导致某个客户端或者服务端断线的情况,导致很多请求信息以及回执信息丢失的情况,接着我们抛弃了http的方式,改为Tcp的方式去建立客…

为什么您仍然不应该购买《星球大战:前线II》

If you’ve been following video game news at all for the last couple of weeks, you’ve probably heard that EA’s Star Wars: Battlefront II is having some teething troubles. EA has backpedaled to avoid more controversy, but we’re here to say: don’t fall f…

web 后台返回json格式数据的方式(status 406)

1.在类上使用注解 RestController public class HttpComentInterface {} 2.在方法是使用注解 ResponseBody RequestMapping(path "/interface/queryRemote", method RequestMethod.POST) //可以指定请求方式ResponseBody public RemoteCommentResultData queryCo…

OpenStack Juno系列之计算节点搭建

OpenStack Juno系列之计算节点搭建 nova-compute安装配置 -------------------- apt-get install nova-compute sysfsutils 编辑配置文件 vi /etc/nova/nova.conf [DEFAULT] verbose True rpc_backend rabbit rabbit_host controller rabbit_password RABBIT_PASS auth_str…

quantum_如何从Firefox Quantum删除Pocket

quantumFirefox Quantum has deep integration with the Pocket read-it-later service, which is now owned by Mozilla. You’ll see a Pocket page action in the address bar, a “View Pocket List” feature in the Library, and recommended articles from Pocket on th…

vue-typescript

教你搭建typescript的vue项目 自尤大神去年9月推出vue对typescript的支持后,一直想开箱尝试vuets,最近一个新项目准备入手typescript,也遇到了很多坑,下面就一步步来吧!!! 1. 项目创建和初始化 …

Couchbase概述

Couchbase概述 Couchbase概述 Couchbase概述Couchbase最早叫Membase,是由Memcached项目组的一些头目另立的山头。2011年与CouchDB合并,正式命名为Couchbase。2013年,作为NoSQL技术初创企业,拿到了2500万美元的D轮投资。截稿时止&a…

Windows 2012 - Dynamic Access Control 浅析

Windows 2012相对于前几个版本而已,做出了大量的改进,尤其体现在安全性和虚拟化方面。Dynamic Access Control ( 动态访问控制)是微软在文件服务器的访问控制上的新功能,极大的提高了安全性和灵活性。经过一天的研究学习&#xff…

windows rt_如何在Windows RT上轻松将网站添加到Flash白名单

windows rtMicrosoft’s Surface RT and other Windows RT-based machines include the Flash browser plugin, but it only runs on websites Microsoft has whitelisted. We have covered how you can add any website to the Flash whitelist, but now there’s an easier w…

powershell实现设置程序相关性脚本

公司一直有台服务器cpu占用很高,分析出是恒生监控程序java占用很高,且三个java程序,仅其中一个很高,要恒生解决,一直未解决,导致每周重启,我司运维都要手动进行程序相关性设置,给运维…

解决npm 的 shasum check failed for错误

使用npm安装一些包失败,类似如下报错情况: C:\Program Files\nodejs>npm update npm npm ERR! Windows_NT 10.0.14393 npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\np…

chromebook刷机_您可以购买的最好的Chromebook,2017年版

chromebook刷机While once considered a novelty item by many tech enthusiasts, Chromebooks have broken out of the “just a browser” mold and become legitimate laptops. They’re full-featured, lightweight machines that can do everything most users need them …

Jmeter JDBC请求-----数据库读取数据进行参数化 通过SSH跳板机连接数据库

前期准备: jdbc驱动:mysql-connector-java-5.1.7-bin.jar Jmeter 要链接MySQL数据库,首选需要下载mysql jdbc驱动包(注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致连接失败…

Exchange server 2010 beta安装部署流程

本文使用了微软公开发布的exchange server 2010 beta进行部署测试。这篇文档将用到下列产品 windows server 2008 64bit enterprise AD function at windows server 2008 exchange server 2010 beta ----------该exchange server 2010 beta版本属于早期版本,目前最新…

08.15《CEP职业发展规划课》

在12,13号的放假后,14,15号安排了CEP职业发展规划课,为期两天的课,内容也是很丰富。 在14号的早上,学习了职场中的基本礼仪、和基本素养的培训,同时对未来的职业规划做出了大致的分析。 在14号的下午开始了简历写作的课…

usb 驱动修复_您可以修复物理损坏的USB驱动器吗?

usb 驱动修复Sometimes accidents happen to a USB drive, and you find yourself in a very bad position when your only copy of an important document is on there. When something like this happens, is it possible to fix a physically broken USB drive? Today’s S…

大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5) 上一节中,我们讲解了逻辑回归的优化,本节的话我们讲解逻辑回归做多分类问题以及传统的多分类问题,我们用什么手段解决。 先看一个场景,假如我们现在的数据集…

Exchange 2016部署实施案例篇-01.架构设计篇(上)

年前就答应大家要给大家写一个关于Exchange规划部署的文章,一直忙到现在也没有倒出时间来写这个东西。特别是节后,更是开工不利啊,各种奇葩问题,真心无语了。废话就不多说了,开始今天的议题。 相信各位对Microsoft Exc…

bzoj 4598: [Sdoi2016]模式字符串

题目描述 给出n个结点的树结构T&#xff0c;其中每一个结点上有一个字符&#xff0c;这里我们所说的字符只考虑大写字母A到Z&#xff0c;再给出长度为m的模式串s&#xff0c;其中每一位仍然是A到z的大写字母。 Alice希望知道&#xff0c;有多少对结点<u&#xff0c;v>满足…