简述并发与并行的区别,并发和并行的区别( 二 )


1.volatile轻量级 , 只能修饰变量 。synchronized重量级 , 还可修饰方法 。2.volatile只能保证数据的可见性 , 不能用来同步 , 因为多个线程并发访问volatile修饰的变量不会阻塞 。四、TreadLocal1.什么是ThreadLocal?ThreadLocal提高一个线程的局部变量 , 访问某个线程拥有自己局部变量 。
当使用ThreadLocal维护变量时 , ThreadLocal为每个使用该变量的线程提供独立的变量副本 , 所以每一个线程都可以独立地改变自己的副本 , 而不会影响其它线程对应的副本 。ThreadLocal接口方法有4个:void set(Object value)设置当前线程的线程局部变量的值;public Object get()该方法返回当前线程所对应的线程局部变量;public void remove()将当前线程局部变量的值删除 , 目的是为了减少内存的占用 , 该方法是JDK5.0新增的方法 。
需要指出的是 , 当线程结束后 , 对应该线程的局部变量将自动被垃圾回收 , 所以显式调用该方法清除线程的局部变量并不是必须的操作 , 但它可以加快内存的回收速度;protected Object initialValue()返回该线程局部变量的初始值 , 该方法是一个protected的方法 , 显然是为了让子类覆盖而设计的 。
这个方法是一个延迟调用方法 , 在线程第1次调用get()或set(Object)时才执行 , 并且仅执行1次 。ThreadLocal中的缺省实现直接返回一个null 。2.ThreadLocal底层实现原理:ThreadLocal通过Thread.currentThread();获取当前线程操作map集合:ThreadLocalMapvoid set(Object value)就是Map.put(“当前线程” , 值);public Object get()就是获取ThreadLocalMap然后操作后返回 。
五、线程池1.为什么要使用线程池?因为要通过线程池来管理线程 , 启动或者停止一个线程非常耗费资源 , 所以将线程交给线程池来管理能够节约内存 。一般在企业开发当中我们都使用线程池 , 通过spring去整合线程池 , 异步注解 。2.什么是线程池?线程池是指在初始化一个多线程应用程序过程中创建一个线程集合 , 然后在需要执行新的任务时重用这些线程而不是新建一个线程 。
线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求 。然而 , 增加可用线程数量是可能的 。线程池中的每个线程都有被分配一个任务 , 一旦任务已经完成了 , 线程回到池子中并等待下一次分配任务 。3.线程池作用:基于以下几个原因 , 在多线程应用程序中使用线程池是必须的:1.线程池改进了一个应用程序的相应时间 。由于线程池中的线程已经准备好且等待被分配任务 , 应用程序可以直接拿来使用而不用新建一个线程 。
2.线程池节省了CLR为每个短生命周期任务创建一个完整的线程开销并可以在任务完成后回收资源 。3.线程池根据当前在系统中运行的进程来优化线程时间片 。4.线程池允许我们开启多个任务而不用为每个线程设置属性 。5.线程池允许我们为正在执行任务的程序参数传递一个包含状态信息的对象引用 。6.线程池可以用来解决处理一个特定请求最大线程数量限制问题 。
4.线程池四种创建方式:java通过Executors(jdk1.5的并发包)提供四种线程池 , 分别为:1.newCachedThreadPool 创建一个可缓存线程池 , 如果线程池长度超过处理需要 , 可灵活回收空闲线程 , 若无可回收 , 则新建线程 。2.newFixedThreadPool 创建一个定长线程池 , 可控制线程最大并发数 , 超出的线程会在队列中等待 。

推荐阅读