java高并发核心要点|系列1|开篇
在java高并发编程,有几个很重要的内容:
1.CAS算法
2.CPU重排序
3.缓存行伪共享
我们先来说说高并发世界中的主要关键问题是什么?
是数据共享。
因为多线程之间要共享数据,就会遇到各种问题。如下图:

如果两个线程同时写入,那怎么保证数据的一致性?是线程1先写,还是线程2先写,这是个问题。那要如何解决这个问题?
答案是:加锁。
比如,线程1先访问共享数据区,那么它就先把这块数据区锁起来。后面如果其他线程要访问这个共享区,首先要从线程1这里获取锁,才能进一步访问这个共享区。这里很好理解,
其实相当于这样的情景,你有一个抽屉,抽屉有把锁,这个锁的钥匙,在你手上,你就可以打开抽屉,往里面存放或拿取物件。其他人,要从这个抽屉里存放东西,必须征得你的同意,从你手上拿到钥匙,然后,他才能用这把钥匙打开抽屉,进行存放物件的动作。如下图:

回到高并发的线程世界,我们知道,可以用加锁来解决多线程访问共享数据区的问题。那问题又来了,那这把锁,先交给谁呢?怎么解决这个问题呢?
答案是:锁竞争。
多线程,如果在优先级一样的情况下,大家进行公平竞争?那怎么样才算公平竞争呢?一般情况下,我们都可以想到:先到先得。
是的,一般情况下,操作系统对线程竞争,都取用这个方式,这样也符合常理。
好,线程1来了,获得一把锁,对这个共享数据区进行锁定访问。那别的线程,只能等待这个线程“办完事”后,释放锁。这时,这些别的线程就进入等待状态。
现在问题,又来了,如果线程1只是对这个共享数据区进行读访问,是否有必要把这个数据区全面锁定,不让其他线程进行读访问呢?
没有必要!
怎么解决?
读写分离!
分别定义两把锁,一把读锁,一把写锁。写锁,还是对写有独占权。读锁,就可以无限量地分发给其他多个线程。这样不影响共享数据区的数据一致性。
其实,读写分离,是架构设计和数据库设计中一个很重要的设计思想,也是高性能的一种设计理念。
当然,锁有很多种,以下就是各种锁:
|
锁 |
优点 |
缺点 |
适用场景 |
|
偏向锁 |
加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距。 |
如果线程间存在锁竞争,会带来额外的锁撤销的消耗。 |
适用于只有一个线程访问同步块场景。 |
|
轻量级锁 |
竞争的线程不会阻塞,提高了程序的响应速度。 |
如果始终得不到锁竞争的线程使用自旋会消耗CPU。 |
追求响应时间。 同步块执行速度非常快。 |
|
重量级锁 |
线程竞争不使用自旋,不会消耗CPU。 |
线程阻塞,响应时间缓慢。 |
追求吞吐量。 同步块执行速度较长。 |
好了,今天,我们主要讲多线程高并发编程的核心概念:线程锁。
明天,我们继续讲锁的底层实现原理。
java高并发核心要点|系列1|开篇的更多相关文章
- java高并发核心要点|系列文章
java高并发核心要点|系列1|开篇 java高并发核心要点|系列2|锁的底层实现原理 java高并发核心要点|系列3|锁的底层实现原理|ABA问题 java高并发核心要点|系列4|CPU内存指令重排 ...
- java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)
今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...
- java高并发核心要点|系列5|CPU内存伪共享
上节提到的:伪共享,今天我们来说说. 那什么是伪共享呢? 这得从CPU的缓存结构说起.以下如图,CPU一般来说是有三级缓存,1 级,2级,3级,越上面的,越靠近CPU的,速度越快,成本也越高.也就是说 ...
- java高并发核心要点|系列2|锁的底层实现原理
上篇文章,我们主要讲了解决多线程之间共享数据的核心问题和解决方案,也讲了锁的简单分类. 那么,这把锁,我们应该怎么去实现呢?如果你是java语言设计者,你又会怎么去设计这个线程锁呢? 直觉告诉我们,我 ...
- java高并发核心要点|系列3|锁的底层实现原理|ABA问题
继续讲CAS算法,上篇文章我们知道,CAS算法底层实现,是通过CPU的原子指令来实现. 那么这里又有一个情景: 话说,有一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且 ...
- 从菜鸟到大神:Java高并发核心编程(连载视频)
任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...
- java高并发核心类 AQS(Abstract Queued Synchronizer)抽象队列同步器
什么是AQS? 全称: Abstract Queued Synchronizer: 抽象队列同步器 是 java.util.concurrent.locks包下的一个抽象类 其编写者: Doug Le ...
- Java高并发和多线程系列 - 1. 线程基本概念
1. 什么是线程? 线程和进程的区别 在了解线程的概念前,我们应该先知道什么是进程? 进程是操作系统的基本概念之一, 它是正在执行的程序实例. * 下面的一些进程的基本概念你可以了解下 ------- ...
- 2017.4.26 慕课网--Java 高并发秒杀API(一)
Java高并发秒杀API系列(一) -----------------业务分析及Dao层 第一章 课程介绍 1.1 内容介绍及业务分析 (1)课程内容 SSM框架的整合使用 秒杀类系统需求理解和实现 ...
随机推荐
- nodejs 之简单web服务器
1.service.js var http=require('http');//引入http模块 var fs=require('fs');//fs模块 var path=require('path' ...
- 阶段3 2.Spring_06.Spring的新注解_5 spring的新注解-PropertySource
数据库的链接 次数是写死的 新建配置文件 定义成员变量 value注解实现 与配置文件的key对应 PropertySource 要想让spring去读取这个配置文件 resource编译后都跑到了. ...
- Web04_JavaScript
String对象 match()找到一个或多个正则表达式的匹配 substr()从起始索引号提取字符串中指定数目的字符 substring()提取字符串中两个指定的索引号之间的字符 <!DOCT ...
- CTF—攻防练习之HTTP—PUT上传漏洞
主机:192.168.32.152 靶机:192.168.32.159 中间件PUT漏洞 包括apache,tomcat,IIS等中间件设置支持的HTTP方法(get,post,head,delete ...
- Altera DDR2 IP核学习总结3-----------DDR2 IP核的使用
根据上一篇生成的IP核,例化之后如上图,Local开头的数据是用户侧数据,其他数据暂时不用纠结,不用管. 这些是需要关注的信号,但是初学阶段很难对这些信号形成具体的概念,这里参考明德扬的代码进行二次封 ...
- P4995 跳跳!
喵喵喵好久没做过贪心的题目了,刷一下免得忘了嘤嘤嘤 题面 虽然是黄题,但是我承认并不是很难,so看代码吧还是.. #include<set> #include<map> #in ...
- 微信小程序开发(一)----- 基础知识
1.什么是微信小程序 概念:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用,体现了“用完即走”的理念,用户不需要关心是否安装太多应用的问题, ...
- Spring boot 整合 shiro 出现 org.apache.shiro.UnavailableSecurityManagerException: 错误
最开始参考的是这个 文档 但是并没有解决我的问题,因为他的配置和我的是一样(差不多)的 https://www.cnblogs.com/ginponson/p/6217057.html 然后看到此篇博 ...
- Node.js 博客搭建
Node.js 博客搭建:https://www.linuxidc.com/Linux/2017-02/140115.htm https://www.cnblogs.com/mrcln/p/93087 ...
- Microsoft BarCode Control 16.0属性
Labview(2018)可通过Active调用Microsoft BarCode Control 16.0来生成条形码, 参考资料如下: 生成效果: 二维码: 条形码: 执行程序发现修改线条宽度不影 ...