并发
文章平均质量分 57
骁兵
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
可见性
Java内存模型硬件内存架构CPU缓存CPU读写与缓存的关系Java内存模型和硬件内存架构之间的桥接产生问题共享对象可见性竞争条件Java内存模型Java内存模型把Java虚拟机内部划分为线程栈和堆。每个线程都有自己的线程栈。如下图。线程栈(Thread Stack):线程栈中存放了本地变量(线程执行过程中在方法内定义的变量,无论是基本类型还是引用类型)堆(Heap):堆上则存放J原创 2017-02-17 23:36:09 · 453 阅读 · 0 评论 -
原子性
当在一个表达式中使用一个non-long或者non-double型字段时,原子性可以确保你将获得这个字段的初始值或者某个线程对这个字段写入之后的值;但不会是两个或更多线程在同一时间对这个字段写入之后产生混乱的结果值(即原子性可以确保,获取到的结果值所对应的所有bit位,全部都是由单个线程写入的)。但是,如下面(译注:指可见性章节)将要看到的,原子性不能确保你获得的是任意线程写入之后的最新值。 在J原创 2017-02-18 10:23:47 · 530 阅读 · 0 评论 -
有序性
重排序在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型:编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。内存系原创 2017-02-19 15:10:15 · 1426 阅读 · 0 评论 -
保证有序性、原子性、可见性
volatile有序性 上图表示,当第一个操作为XX操作,第二个操作为YY操作时,是否允许重排序,NO表示不允许,空表示允许。 从表中可以看出当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。原创 2017-02-25 13:16:26 · 775 阅读 · 0 评论 -
synchronize的实现原理
锁的数据结构同步代码块是使用monitorenter和monitorexit指令实现的,任何java对象都有一个monitor与之关联,当一个monitor被持有后,对象就处于锁定状态。在运行期间,Mard Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储以下数据结构。自旋锁 通常我们称Sychronized锁是一种重量级锁,是因为在互斥状态下,没有得到锁的线程会被原创 2017-02-27 20:40:26 · 16744 阅读 · 2 评论 -
多线程基础
中断线程对象的interrupt()可以在当前线程中打下一个停止的标记,但不会停止线程。线程对象的interrupted()用于测试当前线程对象是否是处于中断状态(调用了interrupt()方法),并返回boolean值,同时清除该中断状态,也就是说第二次调用interrupted()返回false。线程对象的isInterrupted()作用与interrupted()方法类似,但其不会清原创 2017-03-02 21:45:10 · 443 阅读 · 0 评论 -
Lock
Lock接口方法相对于Synchronize,Lock在获取锁的操作上提供了阻塞、非阻塞可中断、超时设置等机制Lock使用方式 使用Lock需要显式的加锁和解锁解锁操作需要放在finally块里,防止锁被超界获取另外,获取锁的操作不能放在try块里,因为Lock是可重入锁,如果外层也已经调用lock()方法,而里层因为调用lock()抛出异常然后调用unlock,外层无法知晓,导致外层代码无法原创 2017-03-12 11:22:54 · 3880 阅读 · 0 评论 -
读写锁实例
import java.util.concurrent.locks.ReentrantReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;public cl原创 2017-03-21 23:26:41 · 431 阅读 · 0 评论 -
RentrantReadWriteLock
http://ifeve.com/java-art-reentrantlock/转载 2017-03-22 20:37:07 · 456 阅读 · 0 评论 -
Java HashMap的死循环
http://blog.youkuaiyun.com/xiaohui127/article/details/11928865转载 2017-03-23 06:57:17 · 292 阅读 · 0 评论 -
HashTable
HashMap和Hashtable的区别HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),转载 2017-03-23 07:28:30 · 374 阅读 · 0 评论 -
ConcurrentHashMap
并发容器之ConcurrentHashMap http://www.cnblogs.com/dolphin0520/p/3932905.htmlget方法为何不需要同步? http://blog.youkuaiyun.com/seapeak007/article/details/53409618原创 2017-03-26 16:44:28 · 288 阅读 · 0 评论 -
ConcurrentLinkedQueue
//以下代码摘自jdk1.8/** * 使用一个空节点初始化队列 */public ConcurrentLinkedQueue() { head = tail = new Node<E>(null);}/** * 在该队列的尾部插入指定的元素。 由于队列是无界限,此方法永远不会返回false。 */public boolean offer(E e) {原创 2017-03-26 21:26:51 · 376 阅读 · 0 评论 -
阻塞队列
对比“非阻塞队列” 相对于ConcurrentLinkedQueue这种非阻塞队列而言,阻塞队列提供了阻塞机制,即在队列不可用时(队满无法入队,队空无法出队),对线程进行阻塞,直至队列可用时再唤醒线程。在队列不可用时,各种处理方法如下图。 ConcurrentLinkedQueue提供了抛出异常和返回特殊值两种出入队方法,阻塞队列则另外提供了后面两种。需要注意的是,如果是无界阻塞队列原创 2017-04-04 10:46:47 · 720 阅读 · 0 评论 -
Fork/Join框架
http://ifeve.com/talk-concurrency-forkjoin/转载 2017-04-05 21:45:00 · 292 阅读 · 0 评论 -
原子操作类
概述 在Atomic包里一共有13个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段。Atomic包里的类基本都是使用Unsafe实现的包装类。 万变不离其宗,JDK提供的原子更新类和方法虽多,但最终依赖的都是CAS操作。原子更新基本类型类 用于通过原子的方式更新基本类型,Atomic包提供了以下三个类: 1. AtomicBoolean:原子更新原创 2017-04-06 21:22:25 · 515 阅读 · 0 评论 -
CountDownLatch
http://ifeve.com/talk-concurrency-countdownlatch/实现原理CountDownLatch内部实现了一个AQS的实例Sync,CountDownLatch的初始化容量为state状态值,调用countdown时,会转而调用sync.releaseShared(1),state状态减一,而调用await()时,则转而调用sync.acquireSharedI原创 2017-04-07 07:25:40 · 318 阅读 · 0 评论 -
CyclicBarrier
CountDownLatch可以实现多个线程等待另外多个线程。CyclicBarrier则是实现了多个线程之间互相等待。 具体可参考:http://ifeve.com/concurrency-cyclicbarrier/原创 2017-04-07 07:36:36 · 396 阅读 · 0 评论 -
Semaphore
Semaphore用于控制同时访问同一资源的最多线程数量。 具体可参考:http://ifeve.com/concurrency-semaphore/原创 2017-04-07 07:47:18 · 296 阅读 · 0 评论 -
Exchanger
Exchanger可以用于让两个线程执行到某一个同步点时执行数据交换,到达同步点的线程需要调用exchange()方法,先到达同步点的线程会一直等待另一个线程也到达同步点并执行exchange().。 具体可参考:http://ifeve.com/concurrency-exchanger/原创 2017-04-07 07:52:10 · 359 阅读 · 0 评论 -
线程池基础类_FutureTask(JDK1.8)
Futurepublic interface Future<V> { /** * Attempts to cancel execution of this task. This attempt will * fail if the task has already completed, has already been cancelled, * or could原创 2017-04-08 08:28:14 · 1982 阅读 · 0 评论 -
线程池基础类_CompletionService(JDK1.8)
CompletionService 用于解耦产生异步任务和消费任务结果,生产者提交用于执行的任务,消费者按照结果产生顺序进行消费。 通常,CompletionService需要依赖Executor去执行任务,在这种情况下,CompletionService只负责管理内部的完成队列,ExecutorCompletionService提供了这种方法的实现。public interface Com原创 2017-04-14 21:21:11 · 601 阅读 · 0 评论 -
线程池基础类_ExecutorService(JDK1.8)
Executor接口public interface Executor { /** * 在未来某个时刻执行给定的任务 */ void execute(Runnable command);}ExecutorService接口作用: 1. 执行任务Runnable(execute方法) 2. 提交任务Runnable、Callable(submit方法)原创 2017-04-18 07:20:16 · 3151 阅读 · 0 评论 -
线程池基础类_ThreadPoolExecutor (JDK1.8)
ThreadPoolExecutor简介 ThreadPoolExecutor使用线程池执行提交的任务,还维护一些基本统计信息,例如已完成任务的数量。 为了适应大多数场景,该方法提供了许多可调参数和钩子方法。但是推荐使用 Executors工厂方法构造实例:Executors.newCachedThreadPool(无限制线程池,具有自动线程回收),Executors.newFixedTh原创 2017-04-22 16:31:37 · 2510 阅读 · 0 评论
分享