周会材料:高并发程序设计<一>
第一章
几个概念
- 同步:一次方法调用须等到其返回后才能有后续
- 异步:一次方法调用后在另一线程执行,调用者可不必等其返回就可进行后续
- 并发:任务以极短的时间交替进行
- 并行:任务同时进行
- 临界区:公共资源
- 阻塞:临界区资源被占用,须等待前一线程释放。
- 死锁:彼此占用所需资源,都无法继续进行
- 饥饿:线程优先级太低,总是无法获得资源
- 活锁:线程彼此主动释放资源给对方,导致无法拿到所有资源正常执行
并发级别:
- 阻塞:临界区加锁,得不到锁就会被挂起等待直到得到所有资源(悲观)
- 无饥饿:公平的锁,所有主程序都有机会执行
- 无障碍:大家都能拿到资源,出了冲突就回滚(乐观),可能导致无限回滚,无法执行完任意一个线程
- 无锁:无锁的并行都是无障碍的,不同的是必然会保证有一个线程能够在有限步完成执行
- 无等待:要求所有线程在有限步内完成(一种实现情况是:读时不加控制,写时修改在副本上伺机返回)
JMM(Java的内存模型)建立原则:原子性,可见性,有序性
原子性:操作不可分,一旦执行不会被干扰
可见性:一个线程修改了一个共享变量的值,其他变量能否立刻知道此修改
有序性:程序执行顺序问题(由指令重排导致)
第二章
1.进程与线程
2.线程的基本操作
- 新建线程:继承Thread或者实现Runable/Callable,重写run,调用start。
- 终止线程:尽量不使用stop()方法
- 线程中断:interrupt()——增强的stop方法
- 等待与通知(与锁有关)
wait(),notify()必须是包含在synchronzied语句中的----notify()随机唤醒一个线程,notifyAll()全部唤醒。
- 挂起与继续执行(废弃方法)
- 等待线程结束(join())与谦让(yield)
可以看出来当前等待对象threadA会一直阻塞,直到被等待对象threadB结束后即isAlive()返回false的时候才会结束while循环,当threadB退出时会调用notifyAll()方法通知所有的等待线程.
public static native void yield();这是一个静态方法,一旦执行,它会是当前线程让出CPU,但是,需要注意的是,让出的CPU并不是代表当前线程不再运行了,如果在下一次竞争中,又获得了CPU时间片当前线程依然会继续运行.另外,让出的时间片只会分配给当前线程相同优先级的线程.
3.对于经常修改的字段类型,可以使用字段volatile确保线程改动数据后其他线程可以看到此改动。
4.线程组
5.守护线程,执行系统的工作线程,特点是当只此线程时虚拟机会停止(Daemon)———可自定义,
6.线程优先级
7.synchronized关键字
并发下的错误:
ArrayList:线程不安全(访问时破坏了内部一致性、访问时保存容器大小的变量访问异常)——————使用Vector
HashMap:线程不安全(可能结构破坏出现环导致无法退出)——————————————————使用ConcurrentHashMap
i++本质:i=Integer.valueOf(i.intValue()+1);其中,Integer.valueOf是一个工厂方法,每次创建一个新的Integer对象,并将其引用复制给i
i++
周会材料:高并发程序设计<一>的更多相关文章
- 【实战Java高并发程序设计 7】让线程之间互相帮助--SynchronousQueue的实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- 【实战Java高并发程序设计 5】让普通变量也享受原子操作
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...
- 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray
除了提供基本数据类型外,JDK还为我们准备了数组等复合结构.当前可用的原子数组有:AtomicIntegerArray.AtomicLongArray和AtomicReferenceArray,分别表 ...
- 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference
[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference AtomicReference无法解决上述问题的根 ...
- 【实战Java高并发程序设计 1】Java中的指针:Unsafe类
是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...
- 《实战java高并发程序设计》源码整理及读书笔记
日常啰嗦 不要被标题吓到,虽然书籍是<实战java高并发程序设计>,但是这篇文章不会讲高并发.线程安全.锁啊这些比较恼人的知识点,甚至都不会谈相关的技术,只是写一写本人的一点读书感受,顺便 ...
- JAVA高并发程序设计笔记
第二章 Java并行程序基础 1.join()的本质是让调用线程wait()在当前线程的对象上 2.Thread.yiedl()会使当前线程让出CPU 3.volatile保证可见性,无法保证原子性( ...
- 《实战Java高并发程序设计》读书笔记
文章目录 第二章 Java并行程序基础 2.1 线程的基本操作 2.1.1 线程中断 2.1.2 等待(wait)和通知(notify) 2.1.3 等待线程结束(join)和谦让(yield) 2. ...
- 周会材料:高并发程序设计<二>
第三章 JDK并发包https://www.cnblogs.com/sean-zeng/p/11957569.html JDK内部提供了大量实用的API和框架.本章主要介绍这些JDK内部功能,主要分为 ...
随机推荐
- java8-date和timeAPI
一 我们为什么要学习 java.timeAPI 原先的Date and Calendar 类的api比较复杂,不易于理解,应用起来不是很灵活. Calendar 是个线程不安全的类会导致SimpleD ...
- JBPM4常用表结构及入门流程
JBPM4 常用表结构 第一部分:表结构说明 Jbpm4 共有18张表,如下,其中红色的表为经常使用的表 一:资源库与运行时表结构 1. JBPM4_DEPLOYMENT 流程定义表 2. J ...
- 面试连环炮系列(四):说说TCP的三次握手过程
说说TCP三次握手的过程? 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认. 第二次 ...
- .NET 收徒,带你走向架构师。
最近感悟天命,偶有所得,故而打算收徒若干,以继吾之传承. 有缘者,可破瓶颈,走向架构师之峰,指日可待. 入门基本要求: 1.工作经验:1年或以上. 2.入门费用:10000元(RMB). 联系方式(联 ...
- 阿里云MVP 第十期全球发布:让天下没有难做的技术
简介: MVPs与阿里云一起探索前路,用技术改变世界! 在云的世界中,从来没有“简单”二字,想成为一个优秀的开发者,也没有“简单”二字,而阿里云MVP就一直是云计算中最为顶尖的专家.现在,阿里云MVP ...
- Java连载59-局部内部类、匿名内部类
一.局部内部类 1.局部内部类等同于局部变量 2.局部内部类在访问局部变量的时候,局部变量必须使用final修饰. 3.举个例子: package com.bjpowernode.java_learn ...
- 比较3个开源数据库:PostgreSQL,MariaDB和SQLite
在现代企业技术世界里,开源软件已牢固地确立了自己作为不可忽视的,最大力量之一的地位.由于开源运动的出现,推动了几十年来的一些最著名的技术发展. 不难理解为什么:尽管基于Linux的开源网络标准可能不像 ...
- 计算机组成原理——I/O接口以及I/O设备数据传送控制方式
接口可以看作是两个部件之间交接的部分.硬件与硬件之间有接口,硬件与软件之间有接口,软件与软件之间也有接口. 这里我们所说的I/O接口,一边连接着主机,一边连接着外设. I/O接口的功能 I/O接口的基 ...
- VMware Workstation15激活码
VG5HH-D6E04-0889Y-QXZET-QGUC8 亲测可用
- ubuntu 安装在硬盘与配置
安装 下载Ubuntu ISO文件,使用rufus制作启动U盘,重启选择这个U盘启动. 用rufus做启动盘时,提示缺少文件,点下载,找到log,进入找到下载地址,手动下载,并放到软件所在路径下的文件 ...