一、jvm的内存模型:
堆、栈、方法区、本地方法栈、程序计数器
二、进程与线程
进程与线程的关系: 进程(Process)是操作系统分配资源的基本单位,一个进程拥有的资源有自己的堆、栈、虚存空间(页表)、文件描述符等信息。 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。
进程和线程的区别:
区别1:从属关系不同从属关系不同: 进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。
区别2:描述侧重点不同描述侧重点不同: 进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
区别3:共享资源不同共享资源不同: 多个进程间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息,而线程可以共享进程资源文件(堆和方法区)。
区别4:上下文切换速度不同上下文切换速度不同: 线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而进程的上下文切换的速度比较慢。
区别5:操纵者不同操纵者不同: 一般情况下进程的操纵者是操作系统,而线程的操纵者是编程人员。
总结:进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。一个进程中至少包含一个线程,线程不能独立于进程而存在。进程不能共享资源,而线程可以。线程可以看作是轻量级的进程,它们的主要区别体现在:从属关系、描述侧重点、共享资源、上下文切换速度和操纵对象等不同。 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
并发编程:主要是通过多线程的技术将CPU的性能发挥到极致,提升系统性能,高并发的系统开发并发编程会显得尤为重要。并发编程会遇到的问题:内存泄露(内存没有办法被回收),线程安全,死锁。
线程同步的方式: 同步方法(synchronized)、同步代码块(synchronized)、使用特殊域变量(volatile)实现线程同步、 使用重入锁(ReenreantLock)实现线程同步、使用局部变量(ThreadLocal)实现线程同步、 使用阻塞队列实现线程同步、使用原子变量实现线程同步
三、线程池
单个线程: Executors.newSingleThreadExecutor();
缓存线程: Executors.newCachedThreadPool();
固定线程:Executors.newFixedThreadPool(2);
定时线程: Executors.newScheduledThreadPool(3);(父类中)
spring线程池: 线程池的启用有两种方式:配置文件或者注解@EnableAsync
四、锁
乐观锁与悲观锁:
悲观锁认为对于同一个数据的并发操作一定是会发生修改的,采取加锁的形式,悲观地认为,不加锁的并发操作一定会出问题。synchronized 关键字和 Lock 接口相关类。
乐观锁正好和悲观锁相反,它获取数据的时候,并不担心数据被修改,每次获取数据的时候也不会加锁,只是在更新数据的时候,通过判断现有的数据是否和原数据一致来判断数据是否被其他线程操作,如果没被其他线程修改则进行数据更新,如果被其他线程修改则不进行数据更新。Lock 是乐观锁的典型实现案例。



