1.多线程基础

为什么会有多线程

本质原因是摩尔定律失效 -> 多核+分布式时代的来临。
JVM、NIO 、MySQL是不是都因为这个问题变复杂?
后面讲的分布式系统,也是这个原因。

为什么会有多线程

多 CPU 核心意味着同时操作系统有更多的并行计算资源可以使用。
操作系统以线程作为基本的调度单元。
单线程是最好处理不过的。
线程越多,管理复杂度越高。
跟我们程序员都喜欢自己单干一样。
《人月神话》里说加人可能干得更慢。
可见多核时代的编程更有挑战。

Java 线程的创建过程

2.Java多线程

线程状态



Thread 的状态改变操作

  1. Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进TIMED_WAITING 状态,但不释放对象锁,millis 后线程自动苏醒进入就绪状态。作用:给其它线程执行机会的最佳方式。
  2. Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的 CPU 时间片,但不释放锁资源,由运行状态变为就绪状态,让 OS 再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield() 达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield() 不会导致阻塞。该方法与
    sleep() 类似,只是不能由用户指定暂停多长时间。
  3. t.join()/t.join(long millis),当前线程里调用其它线程 t 的 join 方法,当前线程进入WAITING/TIMED_WAITING 状态,当前线程不会释放已经持有的对象锁。线程t执行完毕或者 millis 时间到,当前线程进入就绪状态。
  4. obj.wait(),当前线程调用对象的 wait() 方法,当前线程释放对象锁,进入等待队列。依靠 notify()/notifyAll() 唤醒或者 wait(long timeout) timeout 时间到自动唤醒。
  5. obj.notify() 唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll() 唤醒在此对象监视器上等待的所有线程。

Thread 的中断与异常处理

  1. 线程内部自己处理异常,不溢出到外层。
  2. 如果线程被 Object.wait, Thread.join 和 Thread.sleep 三种方法之一阻塞,此时调用该线程的interrupt() 方法,那么该线程将抛出一个 InterruptedException 中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用interrupt() 将不起作用,直到执行到 wait(),sleep(),join() 时,才马上会抛出
    InterruptedException。
  3. 如果是计算密集型的操作怎么办?
  4. 分段处理,每个片段检查一下状态,是不是要终止。

Thread状态


1、本线程主动操作
2、被动:

  • 遇到锁
  • 被通知

3.线程安全

多线程执行会遇到什么问题?

  • 竞态条件
  • 临界区
  • 共享与同步(线程间通信)
  • 多线程

多个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。
不进行恰当的控制,会导致线程安全问题
解决方案:同步/加锁

并发相关的性质

原子性:原子操作,注意跟事务 ACID 里原子性的区别与联系
对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,
要么执行,要么不执行。

只有语句1是原子操作。
多个线程并发问题
类似于
多个事务的并发问

并发相关的性质

可见性:对于可见性,Java 提供了 volatile 关键字来保证可见性。
当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当有其他
线程需要读取时,它会去内存中读取新值。
另外,通过 synchronized 和 Lock 也能够保证可见性,synchronized 和 Lock 能保证
同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改
刷新到主存当中。
volatile 并不能保证原子性

并发相关的性质

有序性:Java 允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影
响到多线程并发执行的正确性。可以通过 volatile 关键字来保证一定的“有序性”(synchronized 和 Lock
也可以)。
happens-before 原则(先行发生原则):

  1. 程序次序规则:一个线程内,按照代码先后顺序
  2. 锁定规则:一个 unLock 操作先行发生于后面对同一个锁的 lock 操作
  3. Volatile 变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
  4. 传递规则:如果操作 A 先行发生于操作 B,而操作 B 又先行发生于操作 C,则可以得出 A 先于 C
  5. 线程启动规则:Thread 对象的 start() 方法先行发生于此线程的每个一个动作
  6. 线程中断规则:对线程 interrupt() 方法的调用先行发生于被中断线程的代码检测到中断事件的发生
  7. 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过 Thread.join() 方法结束、
    Thread.isAlive() 的返回值手段检测到线程已经终止执行
  8. 对象终结规则:一个对象的初始化完成先行发生于他的 finalize() 方法的开始

synchronized 的实现




4.线程池原理与应用












【Java并发】Java并发编程-01相关推荐

  1. java 自幂数_JAVA 编程01:用JAVA语言实现所有自幂数的输出

    数学,是一门古老而又神奇的学问,它离不开数字:但数学也非常"霸道",古今中外,人世间.宇宙中,凡是和数字打交道的学问都包含数学的影子. 在数学领域,四则运算是最基础的也是最常用的运 ...

  2. 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.3节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  3. Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF

    前言 为了帮助初级开发者快速掌握高并发.网络编程.微服务.海量数据的处理这些实用技术,本文以"理论+范例"的形式对各个知识点进行了详细的讲解,力争让读者在实践中快速掌握相关知识. ...

  4. Java增强之并发编程

    Java增强之并发编程 1 多线程 1.1 进程及线程 程序启动的时候,电脑会把这个程序加载到内存,在内存中需要给当前的程序分配一段的独立运行的空间,这个空间就专门负责这个程序的运行.每个应用程序运行 ...

  5. Java零基础并发编程入门

    Java零基础并发编程入门 并发编程主要包括: 线程,同步,future,锁,fork/join, volatile,信号量,cas(原子性,可见性,顺序一致性),临界性,分布式 了解基础: JMM: ...

  6. 【java】java 并发编程 ArrayBlockingQueue

    文章目录 1.概述 1.1 介绍 1.2. 原理和数据结构 1.3. 函数列表 2.源码分析 2.1 创建 2.2 添加 2.3. 取出 2.4. 遍历 3. 示例 1.概述 首先看看文章:[java ...

  7. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  8. 《Java线程与并发编程实践》—— 2.6 小结

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.6节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  9. 《Java线程与并发编程实践》—— 1.2 操作更高级的线程任务

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第1章,第1.2节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  10. 厚积薄发打卡Day26:狂神说Java之JUC并发编程<代码+笔记>(上)

    前言: 学习视频来源:[狂神说Java]JUC并发编程最新版通俗易懂 一个十分优秀且励志的技术大牛+Java讲师,十分推荐他的频道:遇见狂神说

最新文章

  1. 日本“AI 鱼脸识别”项目,每分钟识别 100 条
  2. 发展大数据还有三道坎要迈
  3. OpenCASCADE:Modeling Algorithms模块几何工具之插值
  4. java严格模式_“use strict” 严格模式使用(前端基础系列)
  5. 03-Flutter移动电商实战-底部导航栏制作
  6. C语言多个变量运算存储过程,postgresql函数中的赋值运算和postgresql函数存储过程实现数据批量插入...
  7. 聊透分布式系统一致性
  8. python找图里的环_python判断无向图环是否存在的示例
  9. 2021汉语言文学对高考成绩查询,2021汉语言文学专业就业前景怎么样
  10. 【转】Qt中的QString,QByteArray,Qchar, char*
  11. 报错:mysqldump‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  12. 基于持久层框架hibernate用SpringMVC增删功能
  13. [老文章搬家] 插件化软件设计的头疼问题以及可能的解决思路
  14. OpenFire 安装及配置
  15. android nv21 nv12,android - 将NV21转换为NV12并旋转90度通过libyuv? - 堆栈内存溢出
  16. QComboBox使用讲解
  17. 霹雳吧啦Wz语义分割学习笔记P11
  18. ubuntu配置mta_如何在Ubuntu 18.04上使用Apache为您的域配置MTA-STS和TLS报告
  19. PHP ob缓存页面静态化技术
  20. 游戏开挂的罪与非罪——从“王者荣耀外挂案”说起

热门文章

  1. 神经网络学习笔记3——LSTM长短期记忆网络
  2. 【读书笔记->推荐系统】02-03 逻辑回归
  3. 使用AirCrack破解wifi密码(wpa/wpa2)
  4. 2.zookeeper客户端使用与集群特性
  5. python案例——数学问题案例
  6. 计算机账户注销重新登录,win10系统注销账户切换账号登录的方法
  7. PyGame|给程序插入背景音乐
  8. MySQL自增列之起始与步长
  9. sort函数用法详解
  10. 更新KB5005565补丁后win10局域网打印机不能共享打印