java高并发类_Java 高并发之魂
前置知识
了解Java基本语法
了解多线程基本知识
知识介绍
Synchronized简介:作用、地位、不控制并发的后果
两种用法:对象锁和类锁
多线程访问同步方法的7种情况:是否是static、Synchronized方法等
Synchronized的性质:可重入、不可中断
原理:加解锁原理、可重入原理、可见性原理
Synchronized的缺陷:效率低、不够灵活、无法预判是否成功获取锁
常见问题:
如何选择Lock或Synchronized等
如何提高性能、JVM如何解决那个线程获取锁等
Synchronized简介
作用
官方解释
同步方法支持一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。
通俗易懂的解释
能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
地位
Synchronized是Java的关键字,被Java语言原生支持
代码演示:不使用并发手段的后果演示
代码实战:两个线程同时a++,最后结果会比预计的少
原因
count++,它看上去只是一个操作,实际上包含了三个动作:
读取count
将count加1
将count的值写入到内存中
最基本的互斥同步手段
并发编程中的元老级角色,是并发编程的必学内容
Synchronized的两个用法
对象锁
包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)
代码块形式:手动指定锁对象
方法锁形式:synchronized修饰普通方法,锁对象默认为this
类锁
概念(重要):Java类可能有很多个对象,但只有1个Class对象
本质:所以所谓的类锁,不过是Class对象的锁而已
用法和效果:类锁只能在同一时刻被一个对象拥有
形式1:synchronized加载static方法上
形式2:synchronized(*.class)代码块
消失的请求解决方案
不使用并发手段会有什么后果?如何解决?
解决问题
两个线程同时a++,最后结果会比预计的少
原因
count++,它看上去知识一个操作,实际上包含了三个动作
读取count
将count+1
将count的值写入到内存中
方法一
方法二
方法三
七种常见情况之123
多线程访问同步方法的7种情况
两个线程同时访问一个对象的同步方法
两个线程访问的是两个对象的同步方法
两个线程访问的是synchronized的静态方法
同时访问同步方法与非同步方法
访问同一个对象的不同的普通同步方法
同时访问静态synchronized和非静态synchronized方法
方法抛异常后,会释放锁
情况一:
情况二:
情况三:
情况四:
情况五:
情况六:
情况七:
7种情况总结
3点核心思想
一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应第1、5种情况)
每个实例都对应有自己的一把锁,不同实例之间互不影响;例外:锁对象锁是*.class以及Synchronized修饰的是static方法的时候,所有对象共用同一把锁(对应第2、3、4、6种情况);
无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)
Synchronized缺陷
效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程
不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的
无法知道是否成功获取到锁
常见面试问题
1、使用注意点:锁对象不能为空、作用域不宜过大、避免死锁
2、如何选择Lock和Synchronized关键字?
3、多线程访问同步方法的各种具体情况
java高并发类_Java 高并发之魂相关推荐
- 【java】 java 高并发解决方案和高负载优化方法
[java] java 高并发解决方案和高负载优化方法 参考文章: (1)[java] java 高并发解决方案和高负载优化方法 (2)https://www.cnblogs.com/lonelywo ...
- JAVA中的高并发,解决高并发的方案
java高并发,如何解决,什么方式解决 一.什么是高并发 二.高并发的解决方法有两种 三.追加 一.什么是高并发 1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑 ...
- 什么是并发、高并发以及实现高并发需要考虑的因素
文章目录 1.什么是并发 2.什么是高并发 3.实现高并发需要考虑的因素 3.1 高性能 3.1.1 网络 3.1.2 CPU 3.1.3 内存 3.1.3.4 IO 3.2 高可用性 3.3 高扩展 ...
- 搞懂分布式技术30:高并发解决方案——提升高并发量服务器性能解决思路
高并发解决方案--提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很 ...
- java如何解决高并发问题_java怎么处理高并发?
java处理高并发的方法:1.优化代码,减少不必要的资源浪费:2.把图片与页面进行分离,将图片放到独立的图片服器:3.使用缓存,可以大量减少与数据库的交互,提高性能:4.使用数据库集群:5.进行DB优 ...
- java服务端高并发问题_Java服务端两个常见的并发错误
理想情况来讲,开发在开始编写代码之前就应该讲并发情况考虑进去,但是大多数实际情况确是,开发压根不会考虑高并发情况下的业务问题.主要原因还是因为业务极难遇到高并发的情况. 下面列举两个比较常见的后端编码 ...
- redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...
redis高并发原理 显然,编写URL缩短服务是新的"世界,您好! "在物联网/微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray ...
- java接口并发衡量_java 后端设计高并发接口总结
如何设置高并发接口 一.并发队列的选择 二.请求接口的合理设计 三.高并发下的数据安全 3.1 超发的原因 3.2 悲观锁思路 3.3 FIFO队列思路 3.4 乐观锁思路 一.并发队列的选择 Jav ...
- 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现
在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...
最新文章
- JavaScript脚本文件学习总结
- spring之旅第四篇-注解配置详解
- [iOS]C语言技术视频-10-指针变量
- Mac 技术篇-chrome浏览器启用flash插件最强攻略
- [羊城杯 2020]Power
- Vue 消除Token过期时刷新页面的重复提示
- java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用
- php html标签自定义属性,详解H5的自定义属性data-*
- java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
- 标量函数,多语句表值函数,内嵌表值函数
- python使用python-docx导出word
- 免费赠送2本新书《iOS程序员面试笔试真题与解析》
- 记第十七次CCF CSP认证
- 详解:路由器性能的各项指标
- xshell 5的使用教程
- 数字化审图时代批量生成PDF或者DWF利器SmartBatchPlot
- 圆内接等边三角形的画法_几何画板应用教学,教你绘制圆的内接正三角形
- 2014 usnews 计算机科学 排名 天道留学,2014年美国USNews大学公立大学排名情况
- mysql + excel 校正线上数据
- 上海富爸爸_放弃高薪选择财务自由之路(转)
热门文章
- 开源服务容错处理库Polly使用文档
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
- 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持
- MySQL用户及权限管理
- mysql 行列转换 动态_mysql 行列动态转换的实现(列联表,交叉表)
- XunSearch的安装和加入服务器开机脚本以及将目录写入系统变量
- 剑指offer之和为s的数组
- Android之内存溢出(Out Of Memory)的总结
- 中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍
- python中lines是什么类型_Python中splitlines()方法的使用简介