在java高并发编程,有几个很重要的内容:

1.CAS算法

2.CPU重排序

3.缓存行伪共享

我们先来说说高并发世界中的主要关键问题是什么?

是数据共享。

因为多线程之间要共享数据,就会遇到各种问题。如下图:

如果两个线程同时写入,那怎么保证数据的一致性?是线程1先写,还是线程2先写,这是个问题。那要如何解决这个问题?

答案是:加锁。

比如,线程1先访问共享数据区,那么它就先把这块数据区锁起来。后面如果其他线程要访问这个共享区,首先要从线程1这里获取锁,才能进一步访问这个共享区。这里很好理解,

其实相当于这样的情景,你有一个抽屉,抽屉有把锁,这个锁的钥匙,在你手上,你就可以打开抽屉,往里面存放或拿取物件。其他人,要从这个抽屉里存放东西,必须征得你的同意,从你手上拿到钥匙,然后,他才能用这把钥匙打开抽屉,进行存放物件的动作。如下图:

回到高并发的线程世界,我们知道,可以用加锁来解决多线程访问共享数据区的问题。那问题又来了,那这把锁,先交给谁呢?怎么解决这个问题呢?

答案是:锁竞争。

多线程,如果在优先级一样的情况下,大家进行公平竞争?那怎么样才算公平竞争呢?一般情况下,我们都可以想到:先到先得。

是的,一般情况下,操作系统对线程竞争,都取用这个方式,这样也符合常理。

好,线程1来了,获得一把锁,对这个共享数据区进行锁定访问。那别的线程,只能等待这个线程“办完事”后,释放锁。这时,这些别的线程就进入等待状态。

现在问题,又来了,如果线程1只是对这个共享数据区进行读访问,是否有必要把这个数据区全面锁定,不让其他线程进行读访问呢?

没有必要!

怎么解决?

读写分离!

分别定义两把锁,一把读锁,一把写锁。写锁,还是对写有独占权。读锁,就可以无限量地分发给其他多个线程。这样不影响共享数据区的数据一致性。

其实,读写分离,是架构设计和数据库设计中一个很重要的设计思想,也是高性能的一种设计理念。

当然,锁有很多种,以下就是各种锁:

优点

缺点

适用场景

偏向锁

加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距。

如果线程间存在锁竞争,会带来额外的锁撤销的消耗。

适用于只有一个线程访问同步块场景。

轻量级锁

竞争的线程不会阻塞,提高了程序的响应速度。

如果始终得不到锁竞争的线程使用自旋会消耗CPU。

追求响应时间。

同步块执行速度非常快。

重量级锁

线程竞争不使用自旋,不会消耗CPU。

线程阻塞,响应时间缓慢。

追求吞吐量。

同步块执行速度较长。

好了,今天,我们主要讲多线程高并发编程的核心概念:线程锁。

明天,我们继续讲锁的底层实现原理。

java高并发核心要点|系列1|开篇的更多相关文章

  1. java高并发核心要点|系列文章

    java高并发核心要点|系列1|开篇 java高并发核心要点|系列2|锁的底层实现原理 java高并发核心要点|系列3|锁的底层实现原理|ABA问题 java高并发核心要点|系列4|CPU内存指令重排 ...

  2. java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

    今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...

  3. java高并发核心要点|系列5|CPU内存伪共享

    上节提到的:伪共享,今天我们来说说. 那什么是伪共享呢? 这得从CPU的缓存结构说起.以下如图,CPU一般来说是有三级缓存,1 级,2级,3级,越上面的,越靠近CPU的,速度越快,成本也越高.也就是说 ...

  4. java高并发核心要点|系列2|锁的底层实现原理

    上篇文章,我们主要讲了解决多线程之间共享数据的核心问题和解决方案,也讲了锁的简单分类. 那么,这把锁,我们应该怎么去实现呢?如果你是java语言设计者,你又会怎么去设计这个线程锁呢? 直觉告诉我们,我 ...

  5. java高并发核心要点|系列3|锁的底层实现原理|ABA问题

    继续讲CAS算法,上篇文章我们知道,CAS算法底层实现,是通过CPU的原子指令来实现. 那么这里又有一个情景: 话说,有一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且 ...

  6. 从菜鸟到大神:Java高并发核心编程(连载视频)

    任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...

  7. java高并发核心类 AQS(Abstract Queued Synchronizer)抽象队列同步器

    什么是AQS? 全称: Abstract Queued Synchronizer: 抽象队列同步器 是 java.util.concurrent.locks包下的一个抽象类 其编写者: Doug Le ...

  8. Java高并发和多线程系列 - 1. 线程基本概念

    1. 什么是线程? 线程和进程的区别 在了解线程的概念前,我们应该先知道什么是进程? 进程是操作系统的基本概念之一, 它是正在执行的程序实例. * 下面的一些进程的基本概念你可以了解下 ------- ...

  9. 2017.4.26 慕课网--Java 高并发秒杀API(一)

    Java高并发秒杀API系列(一) -----------------业务分析及Dao层 第一章 课程介绍 1.1 内容介绍及业务分析 (1)课程内容 SSM框架的整合使用 秒杀类系统需求理解和实现 ...

随机推荐

  1. hud 5750 Dertouzos

    Dertouzos Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  2. nodejs之fs 模块

    1.fs模块函数 * .fs.stat 检测是文件还是目录 * .fs.mkdir 创建目录 * .fs.writeFile 创建写入文件 * .fs.appendFile 追加文件 * .fs.re ...

  3. PowerDesigner 入门使用

    <转载于--https://www.cnblogs.com/biehongli/p/6025954.html> PowerDesigner最基础的使用方法入门学习   1:入门级使用Pow ...

  4. echats--》饼图 如何在环形中央设置 文字?

    遇到一个需求,在环形图中央空白部分显示总数量. let data = {         totalNum: "",         data: [           { val ...

  5. Linux ulimit 命令 限制系统用户对 shell 资源的访问

    ulimit命令用来限制系统用户对 shell 资源的访问,常见用法如下: [root@MongoDB ~]# ulimit -a // 查看当前所有的资源限制 [root@MongoDB ~]# u ...

  6. [转帖]「白帽黑客成长记」Windows提权基本原理(下)

    「白帽黑客成长记」Windows提权基本原理(下) https://www.cnblogs.com/ichunqiu/p/10968674.html 提权.. 之前还在想 为什么 我的 sqlserv ...

  7. Sqlserver限制用户访问指定数据库

    USE master CREATE LOGIN test --要创建的用户名 WITH PASSWORD = '123456', --密码 DEFAULT_DATABASE = DBTest, --指 ...

  8. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing

    题意:在这个寒假中,鲍勃有计划在山区度假胜地滑雪.这个滑雪胜地有M个不同的滑雪道和N个不同的标志位于那些转弯处点.从第S标记到第T标志的第i路径具有长度L.每个路径必须遵循降低高度的原则,起点必须严格 ...

  9. 下载MySQL的rpm包安装MySQL

    cd /usr/local/src wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-server-5.7.27-1.el ...

  10. java8之stream和lambda表达式

    JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样? 代码:List<String> list = new ArrayList<>(); list. ...