Java线程并发:知识点
 
发布:一个对象是使它能够被当前范围之外的代码所引用:
常见形式:将对象的的引用存储到公共静态域;非私有方法中返回引用;发布内部类实例,包含引用。
 
逃逸:在对象尚未准备好时就将其发布。
不要让this引用在构造函数中逸出。例,在构造函数中启动线程,线程会包含对象的引用。
 
同步容器:对容器的所有状态进行穿行访问,Vector、Hashtable,Cllections.synchronizedMap|List
并发容器:ConcurrentHashMap,CopyOnWriteArrayList,ConcurrentLinkedQueue、BlockingQueue
 
list 随机访问特性的优势。
 
Blocking 增加了可阻塞的get set操作
 
ConcurrentHashMap:分离锁,为并发访问带来的高的吞吐量,同时几乎没有损失单个线程的访问性能。返回弱一致性的迭代器。
 
迭代器的弱一致性,在迭代器生成以后会检测容器的修改变化。
 
并发容器 size(), isEmpty() 弱化,返回近似结果。
 
CopyOnWriteArrayList:每次修改容器时复制,适用迭代需求大于修改需求情况。
 
生产者消费者模式,运用有界阻塞队列解耦生产者和消费者的代码。
 
Executor任务执行框架,实现了生产者消费者模式。
 
SynchronousQueue:put等待消费者可用,take等待生产者可用,适用于消费者充足的情景。
 
双端队列(deque)关联于窃取工作模式(work stealing),区别于生产者消费者模式中所有消费者共享一个工作队列,工作窃取模式每一个消费者都有自己的双端队列,如果一个消费者完成自己的全部工作,就可以偷取其它消费者队列队尾的任务。
 
工作窃取模式适用于当运行到一个任务的某一个单元时,可能会识别出更多的任务,如遍历文件。
 
当一个方法能够抛出InterruptedException时,说明它是可阻塞方法。抛出或捕获InterruptedException。
 
Synchronizer:同步者---semaphore、barrier、latch,封装状态,决定线程在此状态下的行为(通过或阻塞),提供操控状态的方法,高效的等待同步者进入期望的状态。
 
latch闭锁:延迟线程进度直到线程到达一个终点状态,像一个一次性开关。可以用来确保特定活动直到其它活动完成才发生。
例如:
  1. 确保一个计算不会被执行,直到需要的资源都被初始化。
  2. 确保一个服务不会被开始,直到依赖的其它服务已经开始。
  3. 等待,直到活动的所有部分都为继续处理做好准备。
 
FutureTask可以作为闭锁,抽象的可携带结果的计算,通过callable实现。Future.get依赖于任务的执行状态,任务运行完成则返回结果,否则一直等待,
 
Executor框架利用FutureTask完成异步任务。
 
semapher信号量:用来控制能够同时访问某特定资源的活动数量或同时执行某一给定操作的数量,资源池,容器边界。
 
barrier关卡:类似于闭锁,区别所有的线程必须同时到达关卡,才能继续处理,闭锁等待的是时间,关卡等待的是其它线程,重复使用。通过关卡,await会为每一个线程返回唯一的到达索引号,可以用它来选举产生一个领导,在下一次迭代中承担一些特殊任务。
 
Exchanger一种关卡的形式。
 
 
interrupt并不意味着必然停止目标线程正在进行的工作,它仅仅传递了请求中断的消息。
 
中断通常是实现取消最好的选择。
 
FutureTask和Executor框架可以构建可取消的任务和服务。
 
Future.cancel
『『
    try{
        future = ...
    }finally{
        future.cancel(); //不影响已完成的任务。
    }
 
』』
 
Executor.shutdown()  Executor.awaiTermination(Timeout, Unit) Executor.shutdownNow()
 
生产者消费者模式,使用致命药丸停止含有线程的服务,让消费者确保所有的生产者都已停止
 
Executor.shutdownNow试图取消正在进行的任务,并返回那些已经提交的,但并没有开始的任务清单,但是无法记录已经开始单未结束的任务。
 
守护线程(deamon thread):主要用作执行一些辅助工作,同时又不阻碍JVM关闭。最典型的既是垃圾回收线程。区别于普通线程只是在退出时的区别。
当一个线程退出时,JVM会检查一个运行中线程的详细清单,如果仅剩下守护线程,就会发生正常退出,JVM退出时,所有守护线程都会被抛弃,不会执行finally,也不会释放栈。
可以周期性的执行一些清理工作。
 
Timer:只有一个线程执行任务,可能发生较大的顺延;基于系统时间,可能会因为系统时间的修改而发生执行的变化。
ScheduledExecutorService:作为timer的替代,一个任务一个线程;时间基于相对时间,可以基于rate,也可以基于FixedDelay。
 
线程生命周期的管理
 
任务执行框架的主要作用在于对任务的提交和任务的执行策略的解耦。
 
ThreadLocal 保存线程自身本地变量版本。
 
Catched 一分钟超时。
 
saturation policy 饱和策略。RejectedExecutionHandler
AbortPolicy:中断,execute抛出为检查的RejectedExecutionException,捕获异常处理。
CallerRunsPolicy:主线程运行任务,阻断新任务的加入
DiscardPolicy:丢弃,未能加入的任务丢弃
DiscardOldestPolicy:策略选择丢弃本应该接下来就执行的任务,(注意:优先队列丢弃优先级最高的,不可组合使用)
 
Lock对比与内部所Synchronized 更灵活,可中断(lockInterruptibly),可超时(tryLock(timeout)),公平锁(true),可轮询(tryLock)。必须在finally中释放锁。

Java线程并发:知识点的更多相关文章

  1. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  2. Java 线程并发

    http://www.yesky.com/9/1899009.shtml http://zhidao.baidu.com/link?url=-xZ9JLo5x4bvCSVyXb2XhO6TODnBcU ...

  3. java线程并发工具类CyclicBarrier、CountDownLatch及Semaphore

    一.CyclicBarrier   (原文链接:http://www.studyshare.cn/blog-front/blog/index ) 1.定义 CyclicBarrier是线程并发工具类之 ...

  4. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  5. Java线程并发中常见的锁

    随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想 ...

  6. Java 线程并发策略

    1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 2 java中synchronized的用法 用法1 public class Test{ public ...

  7. Java线程并发中常见的锁--自旋锁 偏向锁

    随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想 ...

  8. java线程并发工具类

    本次内容主要讲Fork-Join.CountDownLatch.CyclicBarrier以及Callable.Future和FutureTask,最后再手写一个自己的FutureTask,绝对干货满 ...

  9. 高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战

    java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战 视频课程包含: ...

随机推荐

  1. Android开发学习之路-EventBus使用

    EventBus是一个通过发布.订阅事件实现组件间消息传递的工具. 它存在的目的,就是为了优化组件之间传递消息的过程.传统组件之间传递消息的方法有使用广播,回调等,而这些方法使用都比较复杂. 工作原理 ...

  2. (转)面向属性的CSS命名

    原文链接:戳这里 自从开始做前端开发以来,我发现在开发页面的时候,总是有一个问题十分影响自己的开发效率,这个问题就是css的命名,主要是指css类选择器的命名.这个问题主要体现在:第一,有的内容你压根 ...

  3. lr文件下载脚本(文件参数化重命名)

    http://wenku.baidu.com/link?url=6oiIadyF9eFS4VshKbfJDnxrBh2IX919ndi0JO8yoqTRNRNIpavFrZJ9LPVb-FBSfbRY ...

  4. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  5. Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

    Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...

  6. 2、C#核心编程结构

     本学习主要参考Andrew Troelsen的C#与.NET4高级程序设计,这小节主要述说以下几个东西: Hello World的Main方法: 利用VS2010新建一个控制台应用程序Hello W ...

  7. Vertica环境安装R-Lang包提示缺少libgfortran.so.1

    环境:RHEL 6.4 + Vertica 7.0.0-11.最终确认安装compat-libgfortran-41-4.1.2-39.el6.x86_64.rpm即可解决. # rpm -ivh v ...

  8. yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习

    对于一个有登录限制(权限限制)的网站,用户输入身份验证信息以后,验证成功后跳转到登录前的页面是一项很人性化的功能.那么获取登录前的页面地址就很关键,今天在做一个yii2项目的登录调试时发现了一些很有意 ...

  9. Apache Spark简单介绍、安装及使用

    Apache Spark简介 Apache Spark是一个高速的通用型计算引擎,用来实现分布式的大规模数据的处理任务. 分布式的处理方式可以使以前单台计算机面对大规模数据时处理不了的情况成为可能. ...

  10. 深入学习jQuery描述文本内容的3个方法

    × 目录 [1]html() [2]text() [3]val()[4]总结 前面的话 在javascript中,描述元素内容有5个属性,分别是innerHTML.outerHTML.innerTex ...