java高并发实践
文章平均质量分 77
zhifeng687
这个作者很懒,什么都没留下…
展开
-
ThreadLocal的内存泄露的原因分析+避免方法
前言在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露、强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这样情况发生,增强系统的健壮性。内存泄露内存泄露为程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,广义并通俗的说,就是:不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。强引用与弱引用强引用,使用最普遍的转载 2015-12-22 23:36:42 · 457 阅读 · 0 评论 -
JVM源码分析之wait()和notify()
wait() 在linux 下 调用 pthread_cond_wait()阻塞在条件变量上notify()方法在linux下调用pthread_cond_signal()唤醒阻塞在条件变量上的线程原创 2016-12-29 17:47:01 · 1741 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码分析之共享锁实现
doAcquireShared()方法该方法在共享模式以不响应中断的方式阻塞等待获取锁,实现如下:1、将当前线程封装成节点入队;2、在死循环中调用park方法。第一次循环(自旋、acquire loop),或者被唤醒从park方法返回后,会判断前驱节点是否是头节点,以及调用tryAcquire()方法是否返回true,如果这2个条件都为真,由当前节点自己设置为头节点,并将后继节点唤醒...原创 2018-07-24 18:02:07 · 526 阅读 · 0 评论 -
jvm源码分析之LockSupport
概述LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用...原创 2017-01-04 20:39:03 · 4706 阅读 · 0 评论 -
synchronization performance optimization in jdk6 官方文档
Java SE 6 includes several new features and enhancements to improve performance in many areas of the platform. Improvements include: synchronization performance optimizations, compiler performance opt...翻译 2018-06-02 13:08:26 · 433 阅读 · 0 评论 -
Java锁消除和锁粗化
转载自:Java锁消除非商业转载,可联系本人删除概述锁消除是Java虚拟机在JIT编译是,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过锁消除,可以节省毫无意义的请求锁时间。实验看如下代码:package com.winwill.lock;/** * @author qifuguang * @date 15/6/5 14:11 */public class TestLoc...转载 2018-06-02 12:29:49 · 28526 阅读 · 5 评论 -
synchronized与ReenterantLock的比较
ReentrantLock是Java并发包中一个非常有用的组件,一些并发集合类也是用ReentrantLock实现,包括ConcurrentHashMap。ReentrantLock具有三个特性:等待可中断、可实现公平锁、以及锁可以绑定多个条件。Java中的ReentrantLockReentrantLock与synchronized关键字一样,属于互斥锁,synchronized中的锁是非公平的...转载 2018-06-06 23:44:38 · 834 阅读 · 0 评论 -
CopyOnWriteArrayList工作原理
写入时复制(CopyOnWrite)思想写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者(Callers)同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资...转载 2018-06-12 10:32:25 · 357 阅读 · 0 评论 -
线程池工作队列饱和策略
Java线程池会将提交的任务先置于工作队列中,在从工作队列中获取(SynchronousQueue直接由生产者提交给工作线程)。那么工作队列就有两种实现策略:无界队列和有界队列。无界队列不存在饱和的问题,但是其问题是当请求持续高负载的话,任务会无脑的加入工作队列,那么很可能导致内存等资源溢出或者耗尽。而有界队列不会带来高负载导致的内存耗尽的问题,但是有引发工作队列已满情况下,新提交的任务如何管理的...转载 2018-05-29 00:05:54 · 496 阅读 · 0 评论 -
jvm源码分析之interrupt()
概述线程的thread.interrupt()方法是中断线程。中断一个线程意味着在线程完成它的任务之前,停止它当前正在执行的操作。如果线程堵塞在object.wait、Thread.join和Thread.sleep,将会清除线程的中断状态,并抛出InterruptedException;如果线程堵塞在java.nio.channels.InterruptibleChannel的IO上...原创 2018-07-19 11:54:41 · 1463 阅读 · 0 评论 -
Condition源码分析
Condition接口概述condition与Lock的实现类结合使用。 如果Lock替换了synchronized方法和语句的使用,则Condition将替换Object监视方法(wait,notify和notifyAll)的使用。condition,也称为condition queue或者condition variables,能让一个线程阻塞在条件变量上,直到其他线程通知该线程条...原创 2018-07-20 16:08:54 · 1618 阅读 · 1 评论 -
JVM源码分析之Object.wait/notify实现
最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证。public class WaitNotifyCase { public static void main(String[] args) { final Object l...转载 2016-12-25 22:34:06 · 776 阅读 · 1 评论 -
jvm源码分析之yield和sleep
转载自:Java线程源码解析之yield和sleep概述由于Thread的yield和sleep有一定的相似性,因此放在一起进行分析。yield会释放CPU资源,让优先级更高(至少是相同)的线程获得执行机会;sleep当传入参数为0时,和yield相同;当传入参数大于0时,也是释放CPU资源,当可以让其它任何优先级的线程获得执行机会;假设当前进程只有main线程,当调用yield之后...转载 2017-01-04 20:35:06 · 1362 阅读 · 0 评论 -
FutureTask源码分析
Future接口概述Future接口代表异步计算的结果,它提供了检查计算是否完成,取消计算执行,等待计算完成并检索计算结果的方法。如果你出于可取消计算执行的目的使用Future,但又不想返回结果,可以使用Future<?>数据类型,并使用null作为底层任务的返回结果。Future接口定义如下:public interface Future<V> {...原创 2018-07-29 22:22:28 · 314 阅读 · 0 评论 -
ForkJoinPool源码分析
概述待续。。common pool** * Common (static) pool. Non-null for public use unless a static * construction exception, but internal usages null-check on use * to paranoically avoid potent...原创 2015-08-04 13:42:46 · 1590 阅读 · 0 评论 -
Java中wait()方法为什么要放在同步块中
如果wait()方法不在同步块中,代码的确会抛出IllegalMonitorStateExeception:public class WaitInSyncBlockTest { @Test public void test() { try { new Object().wait(); } catch (Interrup...转载 2016-12-20 16:08:28 · 507 阅读 · 0 评论 -
DelayedQueue源码分析
概述存放具有过期时间的元素的无界阻塞队列,队列中的元素只有在到达指定过期时间时才能从队列中取出。队列中的head节点的过期时间最长。如果没有元素到达过期时间,则没有head节点,poll方法会返回null。判断一个元素是否过期,是通过调用元素的getDelay(TimeUnit.NANOSECONDS),如果方法的返回值小于等于0,则该元素过期。未过期的元素无法通过调用take方法或poll方...原创 2016-02-27 19:50:32 · 499 阅读 · 0 评论 -
jdk1.8 ConcurrentHashMap源码分析
为什么要用ConcurrentHashMapHashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hashtable都锁住了,全表锁),当多线程并发的情况下,都要竞争同一把锁,导致效率极其低下。而在JDK1.5后为了改进Hashtable的痛点,Con...转载 2015-05-27 12:55:01 · 701 阅读 · 0 评论 -
ReentrantReadWriteLock源码分析
概述ReadWriteLockReadWriteLock持有一对锁,一个是用于读操作的readLock,一个用于写操作的writeLock。readLock是共享锁,可以被多个读线程同时持有,writeLock是独占锁。ReadWriteLock必须保证writeLock操作的内存一致性。也就是说,持有readLock的线程能看到先前writeLock释放后的所有更新。与只使用一个...原创 2018-05-11 15:43:52 · 2185 阅读 · 0 评论 -
Java8新的异步编程方式 CompletableFuture
一. FutureJDK 5引入了Future模式。Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算。Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结...转载 2016-10-17 16:30:03 · 5764 阅读 · 0 评论 -
AbstractQueuedSynchronizer的共享锁实现分析(以CountDownLatch为例)
前言经过本系列的上半部分JDK1.8 AbstractQueuedSynchronizer的实现分析(上)的解读,相信很多读者已经对AbstractQueuedSynchronizer(下文简称AQS)的独占功能了然于胸,那么这次我们通过对另一个工具类:CountDownLatch的分析来解读AQS的另外一个功能:共享功能。AQS共享功能的实现在开始解读AQS的共享功能前,我们再重温一下Count...转载 2018-05-21 23:40:37 · 227 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码分析之独占锁实现
acquire()方法调用tryAcquire()方法判断同步状态是否满足,如果不满足则将线程封装成节点,加入到同步队列。加入到队列后的线程会反复阻塞,每次被唤醒后都再次调用tryAcquire()方法判断同步状态是否满足,如果仍然不满足,继续阻塞等待,直至同步状态满足为止。由于该方法忽略中断,所以在被唤醒后不会判断线程是否被中断。相对地,acquireInterruptibly()方法在被唤...原创 2018-05-21 23:23:20 · 267 阅读 · 0 评论 -
LinkedTransferQueue源码分析
概述在dual queue中,每个节点必须以原子方式持有它们的matchStatus,我们的实现如下:对于数据节点,通过cas将item字段从一个具体的value值转变为null,反之对于请求节点也是一样,通过cas将item字段从null转变为具体的value值。相比朴素的M&S queue,dual queue对enqueue和dequeue操作要求额外的原子保护,也因此它实现了更...原创 2016-02-25 17:49:59 · 1338 阅读 · 0 评论 -
线程与任务(Thread与Runnable)
实现runnable接口的类都是任务类,它在run()内部定义任务逻辑。把任务类对象作为参数创建线程实例,线程就会执行任务。timer是线程,而timertask是任务。创建一个timer,timer内部会自动创建一个线程。executors是executor的工厂类。executor是线程池的执行器。当有大量短小并发的任务时,可以在线程池中执行。原创 2016-02-25 18:57:03 · 708 阅读 · 0 评论 -
LinkedBlockingDeque源码分析
概述只在队列头部插入和删除元素的双向阻塞队列。该队列基于双向链表实现,双向链表仅使用一个ReenterantLock进行锁保护,并使用2个Condition来管理阻塞。因为只使用一个ReenterantLock,所以时间上,元素的插入和删除不能同时进行;空间上,元素的插入和删除只在队列的头部进行操作。为了实现弱一致性的iterator,看起来我们需要保证每个节点都能通过它的前继节点实现gc...原创 2016-02-25 19:02:01 · 3312 阅读 · 0 评论 -
ThreadLocal源码分析
概述一个线程可以设置多个线程局部变量,多个线程局部变量ThreadLocal保存在Thread#ThreadLocalMap中。注意,通过ThreadLocal#get()方法保存的值,并不是保存在ThreadLocal的内部变量中,而是以该ThreadLocal为key(其实是以WeakReference<ThreadLocal>为key),以该值为value,保存在curren...原创 2016-02-25 18:46:21 · 348 阅读 · 0 评论 -
SynchronousQueue源码分析
概述SQ 为等待过程中的生产者或消费者线程提供可选的公平策略(默认非公平模式)。非公平模式通过栈(LIFO)实现,公平模式通过队列(FIFO)实现。使用的数据结构是双重队列(Dual queue)和双重栈(Dual stack)。FIFO通常用于支持更高的吞吐量,LIFO则支持更高的线程局部存储(TLS)。/** * The transferer. Set only in co...原创 2016-02-25 18:04:01 · 632 阅读 · 1 评论 -
ExecutorCompletionService源码分析
概述在使用线程池批量提交task后,如果想要按照future完成的顺序依次处理future,可以通过ExecutorCompletionService实现以上场景。ExecutorCompletionService的实现原理是:维护一个BlockingQueue<Future<V>>队列,在future完成后,将future添加到该队列中。ExecutorCompl...原创 2015-08-15 18:19:46 · 343 阅读 · 0 评论 -
ScheduledThreadPoolExecutor源码分析
概述ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行任务,相对于任务调度的Timer来说,其功能更加强大,Timer只能使用一个后台线程执行任务,而ScheduledThreadPoolExecutor则可以通过构造函数来指定后台线程的个数。该类通过以下特性实现了ThreadPoolExecutor的拓展:使用自定义的FutureTa...原创 2015-08-15 18:37:11 · 349 阅读 · 0 评论 -
ConcurrentLinkedQueue源码分析
概述ConcurrentLinkedQueue是一个无边界的线程安全的非阻塞队列,遵循FIFO。队列的head节点是时间最长的节点,队列的tail节点是时间最短的节点。新元素将会插入在队列的tail节点之后,而队列的检索操作从队列的head节点开始。像很多并发集合一样,该队列不允许null元素。该队列的迭代器iterator是弱一致性的,迭代器返回的元素只是反映了队列在迭代器创建时的状态。...原创 2015-08-15 18:11:04 · 441 阅读 · 0 评论 -
wait for all threads to finish using ExecutorService
问题引出:使用线程池,怎么阻塞等待所有线程执行完成后,才能继续走下面的逻辑?使用awaitTermination只能阻塞等待定时时间,超过该时间后,主线程不再阻塞等待,而线程池中的线程仍会继续运行。executorService.shutdown();boolean taskCompleted = executorService.awaitTermination(6, TimeUn...转载 2015-08-15 17:07:37 · 856 阅读 · 0 评论 -
ThreadPoolExecutor源码分析
概述线程池着手解决2个不同的问题:在执行大量的异步任务时,他们通过减少每个任务创建线程的开销,提供了更好的性能;他们也提供了一种边界和管理资源的方法,包括任务执行时的线程管理。每一个ThreadPoolExecutor也保存了一些基本的统计信息,比如已经完成的任务数。ExecutorService使用线程池中的线程执行每一个提交的任务,通常由Executors的工厂方法来配置Executo...原创 2016-02-25 17:40:32 · 576 阅读 · 0 评论 -
volatile与内存屏障
Intel Processor x86 has astrong memory model.Therefore all barrier StoreStore , LoadLoad, LoadStore are no-op on x86.Except StoreLoad which can be realized viamfence or cpuid orlocked insn. W...转载 2016-08-18 13:43:56 · 2553 阅读 · 0 评论 -
volatile与lock前缀指令
为什么加上lock指令后就能保证volatile关键字的内存可见性。lock指令的几个作用:锁总线,其它CPU对内存的读写请求都会被阻塞,直到锁释放,不过实际后来的处理器都采用锁缓存替代锁总线,因为锁总线的开销比较大,锁总线期间其他CPU没法访问内存lock后的写操作会回写已修改的数据,同时让其它CPU相关缓存行失效,从而重新从主存中加载最新的数据不是内存屏障却能完成类似内存屏障的功能,阻止屏障两遍的指令重排序转载 2016-08-17 23:48:51 · 19790 阅读 · 21 评论 -
use block-level synchronization with private variable of non-primitive type
What is the significance of parameter passed to synchronized?synchronized ( parameter ){}to achieve block level synchronization. Somewhere i saw code likeclass test{ public static...转载 2016-12-21 13:48:54 · 858 阅读 · 0 评论 -
Synchronized实现原理和锁优化
Synchronized的三种用法synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。synchronized 常见的三种用法如下:普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法...转载 2016-12-21 15:55:39 · 3857 阅读 · 0 评论 -
AQS同步器的实现原理
转载自:AQS同步器的实现原理1.什么是AQS? AQS的核心思想是基于volatile int state这样的volatile变量,配合Unsafe工具对其原子性的操作来实现对当前锁状态进行修改。同步器内部依赖一个FIFO的双向队列来完成资源获取线程的排队工作。2.同步器的应用 同步器主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,对同步状态的修改或者访问主要通...转载 2018-04-04 19:44:24 · 578 阅读 · 0 评论 -
Java volatile 关键字解析及使用场景
来源:海子 ,www.cnblogs.com/dolphin0520/p/3920373.htmlvolatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于vol...转载 2016-08-17 11:43:15 · 498 阅读 · 0 评论 -
linkedBlockingQueue源码分析
Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 由于LinkedBlockingQueue实现是线...原创 2017-05-18 11:57:10 · 332 阅读 · 0 评论 -
jvm源码分析之cas实现
概述java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包。可见CAS的重要性。CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内...原创 2017-05-02 16:05:03 · 522 阅读 · 0 评论