理解多线程和线程切换
多线程同时执行可以充分利用 CPU 的多核多线程功能来显著提高应用程序的性能,在多核环境中表现的更加明显(目前市面主流 CPU都是几乎都是多核多线程),即使单核 CPU 也支持多线程。
线程是操作系统调度的最小单元,CPU 通过给每个线程分配 CPU 时间片来实现多线程执行,时间片非常短(一般几十毫秒),通过不停切换线程来执行,给人的感觉是同时执行的。
多线程同时执行可以充分利用 CPU 的多核多线程功能来显著提高应用程序的性能,在多核环境中表现的更加明显(目前市面主流 CPU都是几乎都是多核多线程),即使单核 CPU 也支持多线程。
线程是操作系统调度的最小单元,CPU 通过给每个线程分配 CPU 时间片来实现多线程执行,时间片非常短(一般几十毫秒),通过不停切换线程来执行,给人的感觉是同时执行的。
Java 的线程即是工作单元,也是执行机制。从 JDK 5 开始,把工作单元与执行机制分离开来。工作单元包括 Runnable 和 Callable,而执行机制由 Executor 框架提供。
Executor 提供了一种将任务提交与每个任务如何运行的机制分离的方法(包括线程使用,调度的详细信息)。
Java 应用中对宝贵的稀缺资源池化是保障系统稳定运行,优化系统响应速度的重要手段。
线程池的运用场景非常广,几乎所有需要异步或并发执行任务的程序都可以使用线程池。
非线程安全 是在多个线程对同一个对象中的实例变量进行并发访问,读取的数据不一致,即数据被意外修改过,出现了脏读。
synchronized 是 Java 中的关键字,是一种同步锁,可以修改方法、代码块、静态方法、类,使多线程以排队方式进行同步处理。
JDK 自带的线程类实现了 Runnable 接口,提供了很多方法来支持对线程的操作,可以获取线程ID,线程名,判断线程是否存活等。
JDK 中已提供了对多线程的支持,可以很方便 实现多线程编程,主要有两种方式:一种是继承 Thread 类,另一种是实现 Runnable 接口。
根据 CPU 内核数计算出合理的线程并发数,线程池管理和关闭。
一个 Web
项目的Socket
需用到多线程,每一个连接创建一条线程来处理数据。
在多线程中需要用到 Spring
中的 Bean
,如果直接用 Spring 注入是会报NullPointerException
错误。原因是线程类无法提前委托给Spring
管理,是在使用中创建的。
什么是线程安全?什么是非线程安全,该如何定义和理解?什么场景会出现非线程安全?这几个问题在脑子里有个概念和轮廓,但要描述清楚始终不得,不全,非一两个例子代码。