java多线程与高并发思维导图

思维导图:https://www.processon.com/mindmap/5e9e98fd6376897466837d50

1.基本概念

创建线程的3种方式实现Runnable接口  
继承Thread类run方法执行多线程部分 
实现Callable接口,线程池  
cpuyeild方法,让出一下cpu  
join,加入线程。A jion B,等B执行完再执行A  
sleep,让给别的线程执行  
线程的6种状态new新建状态,还没有调用start() 
RunnableReady-就绪状态等待cpu运行
Running-运行状态在cpu中运行
调用start(),交给操作系统,由线程调度器执行 
TimeWaitingThread.sleep(time),o.wait(time),t.join(time),lockSupport.parkNanos(),lockSupport.parkUntil() 
时间结束 
Waitingo.wait(),t.join,lockSupport.park 
o.notify,o.notifyAll,lockSupport.unpark 
让出cpu 
Blocked等待进入同步代码块的锁 
Terminated线程执行结束 

2.Sychronized

锁对象this   
锁方法,锁的是this   
静态方法。锁T.class   
是可重入锁一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会获得该对象的锁  
程序出现异常,默认清空,锁会被释放   
锁升级markword上记录线程id  
如果线程争用 升级为 自旋锁 用户态 
占用Cpu,但是不占用操作系统 
执行时间短,线程数量少,适合自旋锁 
旋10次之后,拿不到,升级为重量级锁  
synchronized(Object)不能用String常量,Integer,Long  
Volatile保证线程可见性MESI 
Cpu缓存一致性协议 
禁止指令重排序DCL单例Double check Lock 
对象创建过程申请内存
初始化对象
为对象赋值
不能保证原子性  
wait线程锁定  
notify线程唤醒  

3.容器

ConnectionListArrayList  
LinkedList  
线程安全CopyOnWriteArrayList-写时复制应用:读特别多,写很少
VectorStack
SetHashSetLinkedHashSet 
SortedSetTreeSet 
线程安全ConcurrentSkipListSet 
CopyOnWriteArraySet 
EnumSet  
QueueDequeArrayDeque  
BlockingDequeLinkedBlockingDeque 
BlockingQueue阻塞put 
takequeue中没有,使用take阻塞
SynchronousQueue  
DelayQueue按时间排序的队列 
ProtityBlockingQueue  
TransferQueueLinkedTransferQueuetransfer()
ConcurrentLinkedQueue   
与List差异:添加了一些线程友好的Apipoll  
offer  
peek  
AstractQueueProtityQueue排序输出 
二叉树,小顶堆 
MapHashMapLinkedHashMap  
TreeMap   
IdentityHashMap   
线程安全ConcurrentHashMap  
ConcurrentSkipListMap有序,支持并发 
多层链表,加速查询 
TreeMap做CAS太复杂,所以产生跳表 
WeakHashMap   

4.线程池

ThreadPool与Executor

  
ExecuteService  
Executors  
异步调用Future  
Callable-带返回值的Runnable  
ParallelStreamAPI  
常用线程池-ExecutorsExecutors.newFixedThreadPool() 
Executors.newCachedThreadPool() 
Executors.newSingleThreadExecutor()创建单一线程池
Executors.newScheduledThreadPool() 
Executors.newWorkStealingPool()ForkJoinPool()
[http://cdn.processon.com/5ed865151e0853199b4e18eb?e=1591243558&token=trhI0BY8QfVrIGn9nENop6JAc6l5nZuxhjQ62UfM:mwXuBZrK8nzJ11iucTd_QTc6S04=]

 

 

5.java的引用类型

  
软SoftReference对象只有一个软引用,只有堆内存不够的时候才会回收 
-Xms 20M -Xmx20M堆内存最大,最小 
主要用作缓存 
弱WeakReference可以被gc立刻回收 
有强引用,引用断开,立刻就会回收 
用在容器里 
典型:ThreadLocal对象不再使用,必须remove()不然会引起内存泄露
虚PhantomReference应用在jvm 
get方法拿不到值 
引用断开,会放到队列里,回收对外内存 

6.JUC同步工具

cas自旋原理实现方式CAS无锁优化,自旋   
Actomic都是cas方式

[http://cdn.processon.com/5ede63441e0853263718f02e?e=1591636308&token=trhI0BY8QfVrIGn9nENop6JAc6l5nZuxh

jQ62UfM:jhpGxpqYdJl432Yp0talw4SCKJk=]

  
Compare and Set   
cup原语支持,不会被打断,保证线程安全   
ABA问题添加版本号  
基础类型无所谓  
引用类型,对象会变化  
通过Unsafe类实现可以操作jvm的内存  
等同于C c++的指针  
ReentrantLock-可重入锁lock.lock()->锁定,lock.unlock()->解锁    
lock.tryLock(time,TimeUnit.type)->time内尝试获得锁,获取不到放弃    
lock.lockInterruptibly()->可以对interrupt()方法做出响应,可以被打断加锁    
new ReentrantLock(true);->参数为true表示公平锁    
可以添加Condition,精确指定哪个线程被唤醒    
必须手动解锁,在finally执行unlock()    
AQS-AbstractQueuedSynchronizer维护一个volatile的state   
state控制一个存储Thread的双向链表。向链表里添加thread是通过compareAndsetState   
ThreadLocalsetThread.currendtThread.map(ThreadLocal,person) 
设到了当前线程的map里 
线程操作自己的副本,不共享  
应用Spring的声明式事务,保证同一个Connection  
AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架   
java的引用类型  
软SoftReference对象只有一个软引用,只有堆内存不够的时候才会回收 
-Xms 20M -Xmx20M堆内存最大,最小 
主要用作缓存 
弱WeakReference可以被gc立刻回收 
有强引用,引用断开,立刻就会回收 
用在容器里 
典型:ThreadLocal对象不再使用,必须remove()不然会引起内存泄露
虚PhantomReference应用在jvm 
get方法拿不到值 
引用断开,会放到队列里,回收对外内存 
[http://cdn.processon.com/5ee0ff6b5653bb29258fce2e?e=1591807356&token=trhI0BY8QfVrIGn9nENop6JAc6l5nZuxhjQ62UfM:2eV6A9oUa9tuy9htgd2K48Fj3bM=]   
Condition条件等待与通知     
CountDownLatch-门栓latch.await()-->等待    
latch.countDown()    
倒数    
CyclicBarrier-循环栅栏parties->满xx发车    
barrier.await()->等待    
复杂操作:1.数据库,2.网络,3.文件
并发操作:-线程-操作  线程-操作
    
Semaphore-信号灯permit:int    
acquire();获得锁->信号量-1    
release();->释放锁,信号量+1    
限流    
车道和收费站    
Semaphore与Lock的区别     
Exchanger2个线程间交换数据    
LockSupport实现当前线程阻塞和唤醒    
park();     
unpark();可以先于park()执行    
Phaser-多阶段栅栏1.7遗传算法    
phaser.bulkRegister()->注册数量    
phaser.arriveAndAwaitAdvance();->到达后等待往下走    
重新onAdvanc()->前进    
phaser.arriveAndDeregister()    
ReadWriteLock-共享锁,排它锁readLock()->其他线程可以继续读    
writeLock()    
子主题    
LongAdder使用分段锁    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值