并发编程
lw_yang
喜欢学习,努力工作,也享受生活,崇尚简单的快乐和幸福 ,为理想而奋斗
展开
-
线程并发工具类(Fork-Join,CountDownLatch,CyclicBarrier,Semaphore,Exchange)
Fork-Join分而治之:规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解WorkStealing:所谓 Work-Stealing,在 ForkJoinPool 中的实现为:线程池中每个线程都有一个互不影响的任务队列(双端队列),线程每次都从自己的任务队列的队头中取出一个任务来运行;如果某...原创 2019-06-25 22:24:24 · 1293 阅读 · 0 评论 -
Java线程基础
启动线程继承类Thread实现Runnable接口实现Callable接口(包装成FutureTask)停止线程interrupt()中断一个线程,并不是强行关闭这个线程,把中断标志位置为trueisInterrupted()判断当前线程是否处于中断状态,判断中断标志位是否为trueinterrupted()(static方法)判断当前线程是否处于中断状态,中断标志位改为fals...原创 2019-06-22 23:11:01 · 658 阅读 · 0 评论 -
原子操作CAS
CAS原理CAS(Compare And Swap),指令级别保证这时一个原子操作三个运算符:一个内存地址V,一个期望的值A,一个新值B基本思路:如果地址V上的值和期望值A相等,就给地址V赋值给新值B,如果不是,不做任何操作(循环自旋不断进行CAS操作)CAS问题ABA问题:A—》B—》A,内存地址V最后的值确实为A,但在中途发生过改变,却并不知道,可以使用版本号解决开销问题:CAS...原创 2019-06-27 14:16:08 · 920 阅读 · 0 评论 -
并发容器(ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList)
ConcurrentHashMap散列,Hash:把任意长度的输入通过一种算法(散列),变换成固定长度的输出,这个输出值就是散列值,属于压缩映射,容易产生哈希冲突HashMap在多线程put操作时会引起死循环,hashmap里的entry链表产生环形数据结构。关于环形链表的形成,则主要在这扩容的过程。当多个线程同时对这个HashMap进行put操作,而察觉到内存容量不够,需要进行扩容时,多个线...原创 2019-07-02 23:31:39 · 1163 阅读 · 0 评论 -
为什么wait()和notify()需要搭配synchonized关键字使用
##理解此问题先修知识:synchronized 的含义:Java中每一个对象都可以成为一个监视器(Monitor), 该Monitor由一个锁(lock), 一个等待队列(waiting queue ), 一个入口队列( entry queue).对于一个对象的方法, 如果没有synchronized关键字, 该方法可以被任意数量的线程,在任意时刻调用。对于添加了synchroni...转载 2019-06-29 19:04:04 · 823 阅读 · 0 评论 -
显示锁和AQS及其原理
显示锁Lock和Synchronized:优先使用Synchronized关键字,除非需要获取锁可以被中断,超时获取锁,尝试获取锁的功能公平锁和非公平锁:如果在时间上,先对锁获取的请求,一定先被满足,这个锁是公平的,不满足就是非公平的,非公平锁一般效率更高读写锁(ReadWriteLock):Lock和Synchronized都是排它锁,而读写锁同一时刻允许多个线程同时访问,但是写线程访问的...原创 2019-06-29 22:07:29 · 1382 阅读 · 0 评论 -
线程池
线程池概念线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程(提高线程复用,减少性能开销)。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中然后等待下一次分配任务使用线程池的优点:降低资源的消耗。降低线程创建和...原创 2019-07-06 11:31:17 · 676 阅读 · 0 评论 -
ThreadLocal及其原理
ThreadLocal概念ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景下面通过一个例子来证明通过ThreadLocal能达到在每个线程中创建变量副本的效果:public class MiloTheadLocal { ...原创 2019-07-07 01:22:12 · 642 阅读 · 0 评论