多线程高并发
2020-05-25 14:12:50 5 举报
AI智能生成
java多线程
作者其他创作
大纲/内容
AQS-AbstractQueuedSynchronizer
维护一个volatile的state
state控制一个存储Thread的双向链表。向链表里添加thread是通过compareAndsetState
ThreadLocal
set
Thread.currendtThread.map(ThreadLocal,person)
设到了当前线程的map里
线程操作自己的副本,不共享
应用Spring的声明式事务,保证同一个Connection
AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架
LongAdder
使用分段锁
ReentrantLock-可重入锁
lock.lock()->锁定,lock.unlock()->解锁
lock.tryLock(time,TimeUnit.type)->time内尝试获得锁,获取不到放弃
lock.lockInterruptibly()->可以对interrupt()方法做出响应,可以被打断加锁
new ReentrantLock(true);->参数为true表示公平锁
可以添加Condition,精确指定哪个线程被唤醒
CountDownLatch-门栓
latch.await()-->等待
latch.countDown()
倒数
CyclicBarrier-循环栅栏
parties->满xx发车
barrier.await()->等待
复杂操作:1.数据库,2.网络,3.文件
并发操作:-线程-操作 线程-操作
并发操作:-线程-操作 线程-操作
实现方式CAS
无锁优化,自旋
Actomic都是cas方式
Compare and Set
cup原语支持,不会被打断,保证线程安全
ABA问题
添加版本号
基础类型无所谓
引用类型,对象会变化
通过Unsafe类实现
可以操作jvm的内存
等同于C c++的指针
ReadWriteLock-共享锁,排它锁
readLock()->其他线程可以继续读
writeLock()
子主题
java的引用类型
强
软SoftReference
对象只有一个软引用,只有堆内存不够的时候才会回收
-Xms 20M -Xmx20M堆内存最大,最小
主要用作缓存
弱WeakReference
可以被gc立刻回收
有强引用,引用断开,立刻就会回收
用在容器里
典型:ThreadLocal
对象不再使用,必须remove()不然会引起内存泄露
虚PhantomReference
应用在jvm
get方法拿不到值
引用断开,会放到队列里,回收对外内存
Disruptor
创建线程的3种方式
实现Runnable接口
继承Thread类
run方法执行多线程部分
实现Callable接口,线程池
cpu
yeild方法,让出一下cpu
join,加入线程。A jion B,等B执行完再执行A
sleep,让给别的线程执行
线程的6种状态
new
新建状态,还没有调用start()
Runnable
Ready-就绪状态
等待cpu运行
Running-运行状态
在cpu中运行
调用start(),交给操作系统,由线程调度器执行
TimeWaiting
Thread.sleep(time),o.wait(time),t.join(time),lockSupport.parkNanos(),lockSupport.parkUntil()
时间结束
Waiting
o.wait(),t.join,lockSupport.park
o.notify,o.notifyAll,lockSupport.unpark
子主题
Blocked
等待进入同步代码块的锁
Terminated
线程执行结束
Synchroinzed
锁对象this
锁方法,锁的是this
静态方法。锁T.class
是可重入锁
程序出现异常,默认清空,锁会被释放
锁升级
markword上记录线程id
如果线程争用 升级为 自旋锁
用户态
占用Cpu,但是不占用操作系统
执行时间短,线程数量少,适合自旋锁
旋10次之后,拿不到,升级为重量级锁
synchronized(Object)
不能用String常量,Integer,Long
Volatile
保证线程可见性
MESI
Cpu缓存一致性协议
禁止指令重排序
DCL单例Double check Lock
对象创建过程
申请内存
初始化对象
为对象赋值
不能保证原子性
wait
线程锁定
notify
线程唤醒
Phaser-多阶段栅栏1.7
遗传算法
phaser.bulkRegister()->注册数量
phaser.arriveAndAwaitAdvance();->到达后等待往下走
重新onAdvanc()->前进
phaser.arriveAndDeregister()
Semaphore-信号灯
permit:int
acquire();获得锁->信号量-1
release();->释放锁,信号量+1
限流
车道和收费站
Exchanger
2个线程间交换数据
LockSupport
实现当前线程阻塞和唤醒
park();
unpark();可以先于park()执行
容器
Connection
List
ArrayList
LinkedList
线程安全
CopyOnWriteArrayList-写时复制
应用:读特别多,写很少
Vector
Stack
Set
HashSet
LinkedHashSet
SortedSet
TreeSet
线程安全
ConcurrentSkipListSet
CopyOnWriteArraySet
EnumSet
Queue
Deque
ArrayDeque
BlockingDeque
LinkedBlockingDeque
BlockingQueue
阻塞
put
take
queue中没有,使用take阻塞
SynchronousQueue
DelayQueue
按时间排序的队列
ProtityBlockingQueue
TransferQueue
LinkedTransferQueue
transfer()
ConcurrentLinkedQueue
与List差异:添加了一些线程友好的Api
poll
offer
peek
AstractQueue
ProtityQueue
排序输出
二叉树,小顶堆
Map
HashMap
LinkedHashMap
TreeMap
IdentityHashMap
线程安全
ConcurrentHashMap
ConcurrentSkipListMap
有序,支持并发
多层链表,加速查询
TreeMap做CAS太复杂,所以产生跳表
WeakHashMap
0 条评论
下一页