多线程与高并发
单机高并发应该掌握的线程基础:线程状态,异常与锁等,JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等...
寒泉Hq
当你试图解决一个你不理解的问题时,复杂化就产生了
展开
-
多线程与高并发(九):单机压测工具JMH,单机最快MQ - Disruptor原理解析
单机压测工具JMHJMH Java准测试工具套件什么是JMH官网http://openjdk.java.net/projects/code-tools/jmh/创建JMH测试1.创建Maven项目,添加依赖<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20原创 2020-06-29 11:51:38 · 69785 阅读 · 0 评论 -
多线程与高并发(八):ThreadPoolExecutor源码解析, SingleThreadPool,CachedPool,FixedThreadPool,ForkJoinPoll 等
线程池今天我们来看看JDK给我们提供的默认的线程池的实现。ThreadPoolExecutor:我们通常所说的线程池。多个线程共享同一个任务队列。SingleThreadPoolCachedPoolFixedThreadPoolScheduledPoolForkJoinPoll:先将任务分解,最后再汇总。每个线程有自己的任务队列。WorkStealingPoolSingleThreadPoolSingleThreadPool 这个线程池里面只有一个线程。这样可以保证 我们扔进去的原创 2020-06-28 20:51:24 · 66907 阅读 · 0 评论 -
多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等
Executor 接口关系Callable:类似于Runnable,但是可以有返回值Future:存储将来执行的结果。Callable被执行完之后的结果,被封装到Future里面。Future 示例:/** * 认识Callable,对Runnable进行了扩展 * 对Callable的调用,可以有返回值 */package com.mashibing.juc.c_026_01_ThreadPool;import java.util.concurrent.*;public cla原创 2020-06-28 01:32:21 · 66739 阅读 · 0 评论 -
多线程与高并发(六):线程池可用的各种高并发容器详解:CopyOnWriteList,BlockingQueue等
容器物理结构:数组、链表逻辑结构:很多Queue主要是为高并发准备的。Vector HashtableVector Hashtable 自带锁,有很多设计上不完善的地方,现在基本上不用。测试Hashtable的性能:用100的线程,先put进去1000000个数,再get 1000000个数package com.mashibing.juc.c_023_02_FromHashtableToCHM;import java.util.Hashtable;import java.util.U原创 2020-06-26 16:20:55 · 68712 阅读 · 1 评论 -
多线程与高并发(五):强软弱虚四种引用以及ThreadLocal的原理与源码
上节回顾AQS(CLH的变种)因为新加进来的节点要查看前面的节点的状态,所以使用的是双向链表。AQS的底层是 CAS + Volitile,用CAS替代了锁整个链表的操作。公平锁:上来先排队非公平锁:上来直接抢锁state 根据子类不同的实现,取不同的意义。AQS类中有一个内部类Node,里面装的是它的成员变量Thread。很多Node组成一个双向链表,就是一个等待队列。非公平的时候,如果抢不到锁,就进入队列继续等待。如果抢到了,就用CAS的方式设定当前线程为独占这把锁的线程。Var原创 2020-06-25 16:07:11 · 68781 阅读 · 1 评论 -
多线程与高并发(四):LockSupport,高频面试题,AQS源码,以及源码阅读方法论
补充几道面试题锁升级过程:无锁、偏向锁、轻量级锁、重量级锁StampedLock 自己看一下面试题:syn和Reentrantlock的区别?LockSupportLockSupport.park()当前线程停止t.start()LockSupport.unpark(t);让线程继续运行原来想要停止一个线程,需要把线程加在某个锁上之前想要叫醒一个线程,需要notify现在unpark可以先于park调用并且有效,而之前wait不能先于notify调用LockSupport的par原创 2020-06-24 16:30:11 · 68929 阅读 · 0 评论 -
多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等
CASCAS 是一种乐观锁,syncronized 是一种悲观锁AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchronized*/ void m() { // 多个线程调用m时,就不需要手动加锁了 for (int i = 0; i < 10000; i++) //if count1.get() < 1000 count.incrementAndGet(); //count1++ }原创 2020-06-23 11:09:08 · 66511 阅读 · 0 评论 -
多线程与高并发(二):解析自旋锁CAS操作与volatile
Volitile 作用:保证线程的可见性,同时禁止指令的重排序多线程时,存在的问题在于,在一个线程中对副本的更改并没有及时地反映到另外一个线程中。这就是线程之间的不可见。对变量值加了 volitile 之后,一个线程中的改变,在另一个线程中可以立刻看到。volatile 关键字,使一个变量在多个线程间可见,示例:/** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道原创 2020-06-22 12:08:57 · 69366 阅读 · 0 评论 -
多线程与高并发(一):单机高并发应该掌握的线程基础:线程状态,异常与锁等
多线程复习多线程的基本概念什么是一个线程?如何开启一个线程?package com.mashibing.juc.c_000;import java.util.concurrent.TimeUnit;public class T01_WhatIsThread { private static class T1 extends Thread { @Override public void run() { for(int i=0; i.原创 2020-06-21 22:35:34 · 65888 阅读 · 2 评论