今天来聊聊Java开发的天花板,线程,threadlocal
一个进程就是程序执行需要从代码加载,代码执行到执行完毕的一个完整的过程。由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。进程是资源分配的最小单位,线程是CPU调度的最小单位
进程:是并发执行的程序在执行过程中分配和管理资源的最小单位,
线程:是进程的一个执行单元,比进程更小的执行CPU调度的最小单位。
进程特性:
独立性:指拥有独立资源,独立的地址,无授权其他进程无法访问
动态性:与程序的区别就是,进程是动态指令的集合,而程序是静态的指令集合,有生命周期和状态。
并发性:多个进程可以在单核处理器并发执行且互不影响。
性能高,创建容易,轻量级进程
多个线程共享同一进程的资源
应用:一个浏览器同时下载多个图片,一个服务器同时处理多个请求
区别是:并行是同一时刻多个进程在多个处理器同时执行,而并发是指在同一个时刻只能执行一条执行,但相互切换迅速,宏观上看是执行多个指令
一个java程序最少就有两个线程在同时执行:main和GC
程序:静态的状态,是一些指令的集合。
线程:进程中可以分为好多个同步的操作,每一个操作就可以被称为一个线程
进程:分配CPU,内存等等系统资源。
程序----》执行起来就是一个进程,有自己的资源(内存、CPU)------》一个进程可以划分为多个线程。每一个线程是互不影响,单独执行。
***:jvm自动分配线程到os,os自动分配线程到CPU。
1.继承Thread类 2.实现Runnable或Callable接口(推荐)
3.使用线程池(Executors工厂:专门用来创建线程池的)
Runnable没有返回值;Callable可以返回执行结果,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。
Callable接口的call()方法允许抛出异常;Runnable的run()方法异常只能在内部消化,不能往上继续抛。
注:Callalble接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
其具体实现就是:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。
多线程还没总结完,晚点再更新一下。ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。