前置知识

了解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 高并发之魂相关推荐

  1. 【java】 java 高并发解决方案和高负载优化方法

    [java] java 高并发解决方案和高负载优化方法 参考文章: (1)[java] java 高并发解决方案和高负载优化方法 (2)https://www.cnblogs.com/lonelywo ...

  2. JAVA中的高并发,解决高并发的方案

    java高并发,如何解决,什么方式解决 一.什么是高并发 二.高并发的解决方法有两种 三.追加 一.什么是高并发 1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑 ...

  3. 什么是并发、高并发以及实现高并发需要考虑的因素

    文章目录 1.什么是并发 2.什么是高并发 3.实现高并发需要考虑的因素 3.1 高性能 3.1.1 网络 3.1.2 CPU 3.1.3 内存 3.1.3.4 IO 3.2 高可用性 3.3 高扩展 ...

  4. 搞懂分布式技术30:高并发解决方案——提升高并发量服务器性能解决思路

    高并发解决方案--提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很 ...

  5. java如何解决高并发问题_java怎么处理高并发?

    java处理高并发的方法:1.优化代码,减少不必要的资源浪费:2.把图片与页面进行分离,将图片放到独立的图片服器:3.使用缓存,可以大量减少与数据库的交互,提高性能:4.使用数据库集群:5.进行DB优 ...

  6. java服务端高并发问题_Java服务端两个常见的并发错误

    理想情况来讲,开发在开始编写代码之前就应该讲并发情况考虑进去,但是大多数实际情况确是,开发压根不会考虑高并发情况下的业务问题.主要原因还是因为业务极难遇到高并发的情况. 下面列举两个比较常见的后端编码 ...

  7. redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...

    redis高并发原理 显然,编写URL缩短服务是新的"世界,您好! "在物联网/微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray ...

  8. java接口并发衡量_java 后端设计高并发接口总结

    如何设置高并发接口 一.并发队列的选择 二.请求接口的合理设计 三.高并发下的数据安全 3.1 超发的原因 3.2 悲观锁思路 3.3 FIFO队列思路 3.4 乐观锁思路 一.并发队列的选择 Jav ...

  9. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

最新文章

  1. JavaScript脚本文件学习总结
  2. spring之旅第四篇-注解配置详解
  3. [iOS]C语言技术视频-10-指针变量
  4. Mac 技术篇-chrome浏览器启用flash插件最强攻略
  5. [羊城杯 2020]Power
  6. Vue 消除Token过期时刷新页面的重复提示
  7. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用
  8. php html标签自定义属性,详解H5的自定义属性data-*
  9. java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
  10. 标量函数,多语句表值函数,内嵌表值函数
  11. python使用python-docx导出word
  12. 免费赠送2本新书《iOS程序员面试笔试真题与解析》
  13. 记第十七次CCF CSP认证
  14. 详解:路由器性能的各项指标
  15. xshell 5的使用教程
  16. 数字化审图时代批量生成PDF或者DWF利器SmartBatchPlot
  17. 圆内接等边三角形的画法_几何画板应用教学,教你绘制圆的内接正三角形
  18. 2014 usnews 计算机科学 排名 天道留学,2014年美国USNews大学公立大学排名情况
  19. mysql + excel 校正线上数据
  20. 上海富爸爸_放弃高薪选择财务自由之路(转)

热门文章

  1. 开源服务容错处理库Polly使用文档
  2. 在.NET Core中处理一个接口多个不同实现的依赖注入问题
  3. 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持
  4. MySQL用户及权限管理
  5. mysql 行列转换 动态_mysql 行列动态转换的实现(列联表,交叉表)
  6. XunSearch的安装和加入服务器开机脚本以及将目录写入系统变量
  7. 剑指offer之和为s的数组
  8. Android之内存溢出(Out Of Memory)的总结
  9. 中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍
  10. python中lines是什么类型_Python中splitlines()方法的使用简介