在学习并发编程之前,我们需要稍微回顾以下线程相关知识:
线程基本概念
程序:静态的代码,存储在硬盘中
进程:运行中的程序,被加载在内存中,是操作系统分配内存的基本单位
线程:是cpu执行的单位,进程可再分为线程,是程序处理的基本最小单位
线程的创建方式:
类 继承 Thread 重写run() 创建类的对象
实现Runnable接口 重写run() 任务 new Thread(任务)
实现Callable接口 重写call() 有返回值,可以抛出异常
创建线程:
多线程
什么是多线程?
一个程序中,支持同时运行多个线程。
多线程的优点:提升程序响应速度,提升硬件(cpu)利用率
多线程问题:线程过多占内存,cpu需要处理线程,需要性能能够满足;多个线程访问同一个资源
并发编程
什么是并发编程?
并行:同一个时间节点上,多个线程同时发生(真正意义上的同时)
并发:一个时间段内,不同进程交替访问同一个资源;
并发编程:在例如买票,抢购,秒杀等场景下,有大量的请求访问统一资源。会出现线程安全的问题,所以需要通过编程来控制解决让多个线程一次访问资源,解决线程安全问题,称为并发编程。
并发编程的根本原因
1.多核cpu
从而让我们可以实现多个线程同时进行
2.JMM java内存模型
java内存模型,是java虚拟机规范的一种工作模式
将内存范围主内存和工作内存。
变量数据存储在主内存中,线程在操作变量时,会将主内存中的数据复制一份到工作内存,在工作内存中操作完成后,在写回到主内存中。
是仿照于cpu、内存、硬盘的关系
多线程三个性质
1.有序性是什么?
有序性指的是程序按照代码的先后顺序执行。
为了优化性能,有时候会改变程序中语句的先后顺序。cpu 的读等待同时指令执行是 cpu 乱序执行的根源。读指令的同时可以同时执行不影响的其他指令。
2.可见性是什么?
一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性。
3.原子性是什么?
原子性(Atomic)就是不可分割的意思,是指在进行一系列操作的时候这些操作要么全部执行要么全部不执行,不存在只执行一部分的情况。
原子操作的不可分割有两层含义:
1.访问(读、写)某个共享变量的操作从其他线程来看,该操作要么已经执行要么尚未发生,即其他线程看不到当前操作中的中间结果
2.访问同一组共享变量的原子操作时不能相交错的。如现实生活中从ATM机取款。