多线程总结

1、AQS原理
AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制;底层是CAS+volatile,state是volatile修饰的,并且除了setstate还有compareAndSetState方法。
AQS的核心思想是,如果被请求的资源共享空闲,则当前请求的资源的线程设置为有效的工作线程;并将共享资源设置为有效状态;如果被请求的资源共享被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制。这个机制就是用AQS的CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH是一个虚拟的双向列表(不存在链表实例,仅仅存在节点之间的关联关系)synchronzied、ReentrantLock、semaphore、countdownlatch、CyclicBarrier、ReentrantReadWriteLock、Exchanger
2、ReentrantLock既是公平锁也是非公平锁new ReentrantLock(true);这个是公平锁,并不是完全公平,在队列中;ReentrantLock可以代替synchronized,增加加锁条件trylock、可以被打断lockInterruptibly;ReentrantLock底层是CAS
3、CountDownLatch门闩CountDownLatch count = new CountDownLatch();count.await()方法线程会被挂起,它会等待直到count值为0才继续执行;
4、CyclicBarrier栅栏CyclicBarrier barrier = new CyclicBarrier(20); barrier.await();所有的都等着,等barrier到达20才开始执行。限流(Guava RateLimiter)
5、Phaser
6、ReentrantReadWriteLock读写锁:共享锁和排他锁,读线程加读锁效率很高,写线程加写锁。
7、Semaphore信号量:Semaphore s = new Semaphore(); s.acquire();方法获得许可,线程获得许可才能继续执行;s.release();释放资源,其他线程可以继续得到了
8、Exchanger两个线程之间交换信息
9、LockSupport:LockSupport.park()和LockSupport.unpark()实现线程的阻塞和唤醒操作的;unpark()可以先于park()执行,比wait和notify更灵活。
10、创建线程的几种方式 继承Thread、实现Runnable、jdk8 lambada表达式的方式、Executors.newCacheThreadPool();
11、线程池的7个参数:
1、corePoolSize核心线程数,线程池创建完成后,只有任务提交时才会启动;线程池中维护最小的线程数量,即使这些线程是空闲状态,也不会被销毁,除非设置了allowCoreThreadSizeTimeout;
2、maximumPoolSize最大线程数,只有当任务队列满了且核心线程数小于最大线程数的时候才会创建新的线程。
3、keepAliveTime空闲线程存活时间,如果一线程空闲下来并且线程数量大于corePoolSize,则到达指定时间后就会销毁该线程。
4、unit空闲线程存活时间单位,
5、workQueue工作队列,新任务提交后先到该队列,任务调度时再从该队列中取出任务jdk提供四种工作队列ArrayBlockingQueue基于数组的有界队列按照FIFO的方式执行任务、LinkedBlockingQueue基于链表的无界队列(最大为Integer.MAX),也是基于FIFO的方式、SynchronousQueue生产者放入一个任务必须等到消费者取出这个任务、PriorityBlockingQueue具有优先级的无界队列
6、线程工厂,定义线程名称以及是否设置为守护线程
7、拒绝策略:当工作队列中的任务已经达到最大限制,并且线程池中的线程数已经达到最大线程数,再有新任务提交上来的时候就会执行拒绝策略,jdk默认提供了四种拒绝策略:callerRunsPolicy处理拒绝任务的处理程序,可以在executor方法的调用线程中运行被拒绝的任务,除非executor已经关闭,在这种情况下,任务会直接别丢弃。AbortPolicy该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。DiscardPolicy该策略下,直接丢弃任务,什么都不做。DiscardOldestPolicy该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列。
12、synchronized 字节码中表现为ACC_SYNCHRONIZED 底层实现为monitorenter、monitorexit
13、CAS是通过CPU原语实现的不允许被打断;ABA问题,通过增加版本号的方式解决(版本号 AtomicStampedReference),基础类型简单值不需要版本号。CAS操作是通过unsafe类中的compareAndSet实现的。
14、LongAdder在线程特别多的情况下效率很高,内部通过分段锁实现;AtomicLong的效率比synchronized效率更高。
15、强软弱虚四种引用:softReference软引用:内存不足的情况下会回收,主要用于缓存;weakReference弱引用:碰到垃圾回收就会被回收,;plantomReference虚引用:碰到垃圾回收就会被回收;用来管理堆外内存的(直接内存),如果你想自己实现一个netty可能会用到。
16、ThreadLocal:set操作ThreadLocalMap,map.set(this,value);设置值到当前线程的map中,所以其他线程读不到这个值。ThreadLocal内存泄漏场景,线程指向threadLocal时是强引用,ThreadLocalMap中的key指向ThreadLocal时是弱引用,当方法结束的时候强引用结束,则ThreadLocalMap的value是永远不会被回收,引起内存泄漏,所以必须手动回收remove掉。
17、Queue:队列
1、Deque->ArrayDeque,BlockingDeque;BlockingDeque->LinkedBlockingDeque;
2、BlockingQueue->ArrayBlockingQueue,PriorityBlockingQueue,LinkedBlockingQueue,SynchronousQueue, TransferQueue;TransferQueue->LinkedTransferQueue
3、PriorityQueue
4、ConcurrentLinkedQueue
5、DelayQueue

友情链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值