随笔分类 - Java Concurrency in Practice
摘要:ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading), 即如果执行中进行读取时,经常可能有另一执行要写入的需求,为了保持同步,ReentrantReadWriteLock 的读取锁定就可派上用场。 然而,
阅读全文
摘要:我们知道,AtomicLong的实现方式是内部有个value 变量,当多线程并发自增,自减时,均通过CAS 指令从机器指令级别操作保证并发的原子性。 先看LongAdder的add()方法: Cell是Striped64的一个内部类,顾名思义,Cell 代表了一个最小单元,这个单元有什么用,稍候会说
阅读全文
摘要:一、同步与异步 (1)所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。 要么成功都成功,失败都失败,两个任务的状态可以保持一致。 (2)异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执
阅读全文
摘要:由于Integer是不可变的,每个循环增加key的value时会创建一个新的对象 每次value+1时不需要重新创建Integer对象 Integer, Boolean 等 is immutable, you can only change the reference, but you can't
阅读全文
摘要:1. 【强制】获取单例对象要线程安全。在单例对象里面做操作也要保证线程安全。 说明:资源驱动类、工具类、单例工厂类都需要注意。 2. 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资 源不足的问题
阅读全文
摘要:谈谈ConcurrentHashMap1.7和1.8的不同实现
阅读全文
摘要:我们要实现一个线程安全的队列有两种实现方式,阻塞算法、非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁) 或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本节我们就来研究下 ConcurrentLinkedQueue是如何保证线程安全
阅读全文
摘要:一、基本类原子操作 AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference<V>对boolean,Integer,long,reference定义的变量进行原子性的操作, 简单点说就是它提供的方法都是原子性的,不会出现线程之间存在的问题 二、原子
阅读全文
摘要:CopyOnWriteArrayList,顾名思义,Write的时候总是要Copy,也就是说对于任何可变的操作(add、set、remove)都是伴随复制这个动作的 A thread-safe variant of ArrayList in which all mutative operations
阅读全文
摘要:1.术语 术语 英文单词 描述 内存屏障 Memory Barriers 是一组处理器指令,用于实现对内存操作的顺序限制。 In the Java Memory Model a volatile field has a store barrier inserted after a write to
阅读全文
摘要:http://www.zhihu.com/question/20511233/answer/24260355没有啥复杂的东西,考虑清楚需求,就可以很自然的衍生出这些解决方案。一开始大家想要同一时间执行那么三五个程序,大家能一块跑一跑。特别是UI什么的,别一上计算量比较大的玩意就跟死机一样。于是就有了...
阅读全文
摘要:一。引文1.1 SMP(Symmetric Multi-Processor)对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP能够保证内存一致性,但这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,...
阅读全文
摘要:一、 演示 There are three general strategies for queuing: 排队有三种通用策略: 直接提交。工作队列的默认选项是 SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败
阅读全文
摘要:一、结构 Lock的实现类其实都是构建在AbstractQueuedSynchronizer上,每个Lock实现类都持有自己内部类Sync的实例 二、LockSupport Basic thread blocking primitives for creating locks and other s
阅读全文
摘要:Servlet Threading ModelThe scalability issues of Java servlets are caused mainly by the server threading model:Thread per connectionThe traditional IO...
阅读全文
摘要:The terms asynchronous and non-blocking are closely related and are often used interchangeably, but they are not quite the same thing. Blocking A func
阅读全文
摘要:一。锁的劣势 (1) 在JDK1.5之前都是使用synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守 护变量的锁,都采用独占的方式来访问这些变量 (2)如果出现多个线程同时访问锁,则一些线程将被挂起,当线程恢复执行时,必须等待其它线程
阅读全文
摘要:实现FutureTask的要点 1.需要实现一个链表(每个节点包含当前线程的引用) 2.通过LockSupport.park 对线程进行阻塞 3.节点的唤醒(task完成, 线程Interrupt, 或await超时), FutureTask.run 方法 public void run() { /
阅读全文
摘要:一、ThreadLocal的原理以及存在的问题 a. 每个线程内部维护了一个ThreadLocal.ThreadLocalMap类型的变量 b. ThreadLocalMap 的 key 为 ThreadLocal,value为对应的变量 c. 对ThreadLocal进行get/set操作时,会先
阅读全文