java高并发类_Java 高并发之魂

前置知识

了解Java基本语法

了解多线程基本知识

知识介绍

Synchronized简介:作用、地位、不控制并发的后果

两种用法:对象锁和类锁

多线程访问同步方法的7种情况:是否是static、Synchronized方法等

Synchronized的性质:可重入、不可中断

原理:加解锁原理、可重入原理、可见性原理

Synchronized的缺陷:效率低、不够灵活、无法预判是否成功获取锁

常见问题:

如何选择Lock或Synchronized等

如何提高性能、JVM如何解决那个线程获取锁等

Synchronized简介

作用

官方解释

同步方法支持一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。

通俗易懂的解释

能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。

地位

Synchronized是Java的关键字,被Java语言原生支持

代码演示:不使用并发手段的后果演示

代码实战:两个线程同时a++,最后结果会比预计的少

6dff78dbddbca4bc917212e4184a4d15.png

原因

count++,它看上去只是一个操作,实际上包含了三个动作:

读取count

将count加1

将count的值写入到内存中

最基本的互斥同步手段

并发编程中的元老级角色,是并发编程的必学内容

Synchronized的两个用法

对象锁

包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)

代码块形式:手动指定锁对象

fb68695f41c5f1282fa9f87d4fc54019.png

32746240292bfa1c8c24cbac54118a87.png

f1e117b6fe7177adf8bf3476a3031106.png

614223fe447f6cb392b3a4a8e5a8360c.png

方法锁形式:synchronized修饰普通方法,锁对象默认为this

b74f32e01b1b998b30d951d71b040d0e.png

类锁

概念(重要):Java类可能有很多个对象,但只有1个Class对象

本质:所以所谓的类锁,不过是Class对象的锁而已

用法和效果:类锁只能在同一时刻被一个对象拥有

形式1:synchronized加载static方法上

586c4b9fc2a1360da7cfc62749666c31.png

形式2:synchronized(*.class)代码块

5a793026044d160679a9a396370b87f3.png

消失的请求解决方案

不使用并发手段会有什么后果?如何解决?

解决问题

两个线程同时a++,最后结果会比预计的少

原因

count++,它看上去知识一个操作,实际上包含了三个动作

读取count

将count+1

将count的值写入到内存中

方法一

43fe5687521087e6c656dadc3e921ae7.png

方法二

eb0e43e49d081031fe15094a89e8b170.png

方法三

4f3f472aafe17fa56340b24a26888800.png

七种常见情况之123

多线程访问同步方法的7种情况

两个线程同时访问一个对象的同步方法

两个线程访问的是两个对象的同步方法

两个线程访问的是synchronized的静态方法

同时访问同步方法与非同步方法

访问同一个对象的不同的普通同步方法

同时访问静态synchronized和非静态synchronized方法

方法抛异常后,会释放锁

情况一:

b3dcc69902da33de5e6bb5454fade082.png

情况二:

89f4bcf1ca3ed6cd73281a6050e1fc03.png

情况三:

6ad9fd969f26408f7cb1b14d57887999.png

情况四:

5ceb492dd9e7884985d9b007e011f592.png

e681f8be61eceed5793c07b854de174f.png

情况五:

92ebd72fe5368c271324bc098ff4fc99.png

362c1adba6b58ea4f914aadbc5ffb365.png

情况六:

19d1b1b6c6860160bf43837066728d98.png

1302c737ba2fd0e6db14ceb3ddb66842.png

6a51153d8d8125925d190c1d73f86564.png

情况七:

b5874741703997572a034de77d5cdacb.png

7种情况总结

3点核心思想

一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应第1、5种情况)

每个实例都对应有自己的一把锁,不同实例之间互不影响;例外:锁对象锁是*.class以及Synchronized修饰的是static方法的时候,所有对象共用同一把锁(对应第2、3、4、6种情况);

无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)

Synchronized缺陷

效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程

不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的

无法知道是否成功获取到锁

3a354bc774dd931733400571ab50f137.png

常见面试问题

1、使用注意点:锁对象不能为空、作用域不宜过大、避免死锁

2、如何选择Lock和Synchronized关键字?

3、多线程访问同步方法的各种具体情况

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

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

相关文章

.NET 开源配置组件 AgileConfig 初体验

介绍在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置中心等,很多开发人员可能更熟悉 ApolloConfig,这个组件功能也很完善&…

来领资料咯!计算机专业教科书礼包

现在计算机行业越来越火爆,技术的更新也越来越快,不好好充实自己的话,就会被淘汰。小编这几年一直有意识地收集计算机行业相关的书籍,现在已经拥有5G左右的资料,如C、Java、Python、机器学习、网页开发Web Dev、数据分…

Asp.Net Core 5 REST API - Step by Step(一)

翻译自 Mohamad Lawand 2021年1月19日的文章 《Asp.Net Core 5 Rest API Step by Step》 [1]在本文中,我们将创建一个简单的 Asp.Net Core REST API Todo 应用程序,在其中我们可以添加、编辑、删除和查看待办事项,并且将使用 SQLite 来存储数…

身为程序员碰到最奇葩的需求是怎样的?

梁大折腾部门老大:你,做个微信小游戏吧我:啥样的?老大:反正你就做个小游戏吧,这个火我:?????柔情领导:那个运维啊,你来把他…

15个未来高科技产品会让你无法想象!这些开脑洞的设计太牛了!

导读:从衣食住行到生活的方方面面,未来必将会有天翻地覆的变化。大数据、云计算、物联网和人工智能这些年的发展,让我们对并不遥远的未来有了更多想象和期待。那些我们现阶段不可企及的所思所想,将在未来成为大部分人的日常。这么…

解决 .NET Core 在 Linux Container 中获取 CurrentCulture 不正确的问题

背景在将公司一款基于 .NET Framework 的控制台程序迁移到 .NET Core 3.1 时,发现程序中本地化的部分失效,症状类似于对 Thread.CurrentThread.CurrentCulture.Name 的值进行 Substring() 操作时抛出 ArgumentOutOfRangeException 异常。该程序在 Window…

机器学习资料升级版来了!!!

机器学习一直是一个热门的领域。上次分享的机器学习资料【资源】机器学习资料包来袭受到大家的广泛好评,今天小编打算分享一份机器学习升级版的资料,有斯坦福大学-深度学习基础教程、机器学习实战、人工智能与大数据、Tagging等。顺序最下优化算法Error …

K-Means算法的10个有趣用例

K-means算法具有悠久的历史,并且也是最常用的聚类算法之一。K-means算法实施起来非常简单,因此,它非常适用于机器学习新手爱好者。首先我们来回顾K-Means算法的起源,然后介绍其较为典型的应用场景。起源1967年,James M…

C# $的用法

今天闲来无事,就随便在网上乱看,突然想到Jquery的$符号很强大,那么C#有没有这个东西呢,一查,果然有。经查证发现,这个是在C#6.0出现的一个新特性,也就是一个小语法糖,其作用相当于对…

想转行人工智能?机会来了!!!

一个坏消息:2018年1月 教育部印发的《普通高中课程方案和语文等学科课程标准》新加入了数据结构、人工智能、开源硬件设计等 AI 相关的课程。这意味着职场新人和准备找工作的同学们,为了在今后十年内不被淘汰,你们要补课了,从初中…

tankwar java_TankWar 单机(JAVA版) 版本0.3 画出坦克

其实就是通过自定义的panel 重写里面的paint方法 使用Graphics类画一个圆然后把自定的panel添加到窗口中由于想到tank不能只画一个 所以我们封装一个tank类 里面有一个draw方法 用来画 坦克通过实例化tank 调用draw方法就能实现画tank了具体代码如下:Tank类pac…

轻量NuGet服务—BaGet

相信大家都受益过nuget.org,上面的海量的库、工具、模板为我们开发提供了极大的帮助,其中有很多都是非常宽松的开源协议,在此感谢那无私奉献的人。有的时候,在企业内部,有些库是私有的,专项的,要…

使用 Github Actions artifact 在 workflow job 之间共享数据

AgileConfig 在使用 react 编写UI后,变成了一个彻彻底底的前后端分离的项目,上一次解决了把react spa 跟asp.net core 站点集成起来ASP.NET Core 集成 React SPA 应用。本来我每次提交代码的时候都需要手动运行npm run build,然后把dist的内容复制到asp…

撤回的微信消息真的看不到?78行Python代码帮你看穿一切!

导读:Python曾经对我说:"时日不多,赶紧用Python"。于是看到了一个基于python的微信开源库:itchat,玩了一天,做了一个程序,把私聊撤回的信息可以收集起来并发送到个人微信的文件传输助…

lmbs PHP,PHP 清空 MySql 指定数据表中的所有数据

PHP 清空 MySql 指定数据表中的所有数据PHP 清空 MySql 指定数据表中的所有数据,在烈火小编在网上闲逛时,这是某技术博客的一篇文章,说是文章,并没有文字,只有代码,经过测试可以使用,现在分享给…

全网最通透的“闭包”认知 · 跨越语言

闭包作为前端面试的必考题目,常让1-3年工作经验的JavaScripter感到困惑,其实主流语言都有闭包。今天我们深入聊一聊[闭包], 查缺补漏!1. 以面试题 投石问路 2. 以C#闭包 庖丁解牛 3. 跨越语言 追本溯源 • 头等函数 •…

北大最神博士论文:为什么学校打印店老板大多是湖南人?

导读:北京大学社会学系博士冯军旗的一篇论文,虽然是话题看起来有些奇葩,但仍然考据严谨,很有价值。01 写在前面(非论文部分)多媒体出版行业中,充满油墨芬芳的印刷总是长盛不衰。特别是在大学校园…

技术分享 | jaeger链路日志实现

源宝导读:随着企业应用越来越复杂,内部的调用链条越来越长,性能问题也变得越来越难以定位和排查,为了应对此问题,我们在移动平台中引入了“jaeger调用链追踪工具”,帮助我们高效定位云端服务的性能问题。本…

IT资料,重磅来袭!

现在IT行业越来越火爆,技术的更新也越来越快,不好好充实自己的话,就会被淘汰。小编这几年一直有意识地收集IT行业相关的资料,现在已经拥有8G左右的资料,如区块链、Python、大数据、人工智能深度学习等方面的资料&#…

荐书 | 10本书给你计算机大师思维

《黑客与画家》作者:保罗格雷厄姆 / 译者:阮一峰美国互联网界如日中天的教父、哈佛大学离经叛道的博士保罗格雷厄姆著作!一本书,你不曾想到的视角,彻底颠覆你对世界的认识!美国亚马逊、纽约时报超级畅销书&…