线程是计算机的执行流,java支持多线程并发(理解:多个任务执行,这样计算机在单位时间内处理能力更强),单进程并行
线程:
当一个程序在运行时就属于一个进程
进程 : 包括运行中的程序和程序所使用到的内容和系统资源(补充: 进程就是一个应用程序的可执行单位,进程有自己独立的工作内存)
而线程 : 是程序中的一个执行流,每个线程都有自己的寄存器(栈指针,程序计数器),但是代码区是共享的. 也就是不同的线程可以执行同样的函数(补充: 线程是进程的可执行单位,一个进程有多个线程,线程有自己独立的工作内存)
一个进程可以有很多线程,每条线程并行执行不同的任务,线程又分为多线程和单线程
理解:
从程序上来说 :
一. 单线程在同步应用程序的开发非常有优势,但是需要在一个任务完成后才能开始新的任务,所以单线程的执行效率也就比不上多线程的执行效率. 如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应
单线程的优势 : 不会出现抢占资源出现死锁现象.
二. 多线程出来可以同时运行多个过程,由于多线程应用程序划分成独立的任务 -- 可以显著的提高性能
2.1 多线程技术可以是程序的响应速度更快,因为用户界面可以在进行其他工作的同事一直处于活动状态
2.2 当前没有进行处理的任务可以将处理器时间让给其他任务
2.3 占用大量处理时间的任务可以定期将处理器时间让给其他任务
2.4 可以随时停止任务
2.5 可以设置各个任务的优先级来优化性能
多线程的弊端 :
1. 多线程也是程序,所以线程需要占用内存,线程越多占用的内存也就越多
2. 多线程需要协调和管理,所以需要CPU时间跟踪线程
3. 线程之间对共享资源的访问会互相影响,必须解决竞争共享资源问题
4. 线程太多会导致控制值太复杂,最终可能是系统bug频发
线程安全性问题:
1. 原子性问题 : 一个或者多个操作要么全部执行,要么全部不执行,多个操作之间是不可分割的
2. 有序性问题 : 当代码在进入编译期的时候,代码可能会重排,而代码的重排可能会对其他线程访问的结果产生影响
3. 可见性问题 : 我们的共享变量都是存储在jvm主内存中的,而线程是有自己独立的工作内存,当线程在执行时回去将主内存中的共享变量拷贝一份到自己的工作内存中,在工作内存中对变量的操作他不会去读写主内存中变量的值
以上问题我们可以使用同步代码块Synchronized 加锁的方式解决,但是Synchronized 是属于一个悲观锁他的执行效率是很慢的,我们还可以使用lock锁乐观锁
CAS机制 --- 比较并交换
在线程可见性问题中,CAS机制就是将工作内存中的变量值和主内存中变量的值去比较,如果不同就交换,如果相同就不交换重新去主内存中获取变量值