先了解几个概念多线程:进程和线程是一对多的关系,一个进程(一个程序),由不同的线程来运行。有共享的空间也有独立的空间。
并行: 同时进行,拿两个cpu来跑同样的程序同样的代码片段,那就并行了。
并发:不同时进行,只有一个cpu,而多个线程都在争取这个cpu资源。便是并发。用TPS和QPS去衡量并发程度。
TPS:Transactions Per Second(每秒传输的事物处理个数),简单说就是服务器每秒处理事务的个数。
完整的包括: 请求+数据库访问+响应
QPS:Queries Per Second(每秒查询率),简单说就是服务器每秒处理完请求的个数。
1、线程的生命周期
先了解线程的生命周期,上图。线程的生命周期从一个新的线程产生到结束中间会经历非常多的情况,大体上如下图,多线程环境下我们主要是再running的时候采取线程的保护措施,从而使多线程环境下,让线程进入阻塞的状态。这种保护思想其实就是排他了,到最后都得一个个来,无论式任务还是内存互不干扰,便达到线程安全了。
线程的生命周期
2、jvm内存模型
到了jdk8,内存模型已经有了相当的改变了,下图是小编学习了几篇优秀的博文学习,根据自己的理解绘制出来的,请多指教。
jdk8内存模型
独立内存空间
从图中可以看出线程安全的区域是在栈空间,每个线程会有独立的栈空间,从而也解释了为什么方法内是线程安全的,而全局变量这些是线程不安全的,因为这些都在堆区。
共享内存空间
堆空间,和MateSpace是被所有线程共享的,因此在处理多线程问题的时候,其实主要是处理这两个空间的内容。共享区域在不加任何保护的情况下对其操作,会有异常结果。
怎么做到线程安全?只使用线程安全的内存空间,不使用共享的空间
对共享的内存空间采取保护措施,比如:加Lock,volatile修饰等
3、线程的实现方式继承Thread实现Runnable接口Callable和Future
补充:Fulture和Callable(Future模式)