并发
文章平均质量分 67
你好y
这个作者很懒,什么都没留下…
展开
-
Tomcat线程池
Tomcat线程池Tomcat在哪里用到了线程池呢?LimitLatch用来限流,可以控制最大连接个数,类似J.U.C中的Semaphore后面再讲Acceptor只负责[接收新的socket连接]Poller 只负责监听socket channel是否有[可读的IO事件]一旦可读,封装-一个任务对象(socketProcessor) ,提交给Executor线程池处理Executor 线程池中的工作线程最终负责[处理请求]Tomcat线程池扩展了ThreadPoolExecutor,行原创 2021-10-17 11:04:17 · 313 阅读 · 0 评论 -
ThreadPoolExecutor和Executors
1、ThreadPoolExecutor1)线程池状态ThreadPoolExecutor使用int的高3位来表示线程池状态,低29位表示线程数量1.线程池的五种状态,只能由小到大迁移,即-1>0>1>2>3。2.shutdown(不清空任务队列、 会等它们完成,shutdownNow)会清 空任务队列、不等它们完成。shutdown()只中断空闲的线程,shutdownNow()会 中断所有的线程,不管你执行没执行完。3.TIDYING 和TREMINATED二者之原创 2021-10-17 11:02:55 · 1135 阅读 · 0 评论 -
ReentrantLock原理和Semaphore
AQS原理I.概述全称是AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架之前学过阻塞式的synchrnized和非阻塞式的cas方式自旋的特点:用state属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState -获取state状态setState -设置state状态compareAndSetState -cas乐观锁机制设置state 状态独占模式是只有一个线程原创 2021-10-17 11:01:11 · 646 阅读 · 0 评论 -
Fork-Join
Fork/Join1)概念Fork/Join是JDK 1.7加入的新的线程池实现,它体现的是- -种分治思想,适用于能够进行任务拆分的cpu密集型运算所谓的任务拆分,是将一一个大任务拆分为算法上相同的小任务,直至不能拆分可以直接求解。跟递归相关的-些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解Fork/Join在分治的基础,上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率Fork/Join默认会创建与cpu核心数大小相同的线程池有返回值就使用Rec原创 2021-10-17 10:54:30 · 70 阅读 · 0 评论 -
CountdownLatch和CyclicBarrier
1.CountdownLatch用来进行线程同步协作,等待所有线程完成倒计时。其中构造参数用来初始化等待计数值,await() 用来等待计数归零, countDown( 用来让计数减一什么时候倒计时减为0,等待的线程就可以运行了代码:package demo1;import java.util.concurrent.CountDownLatch;public class CountDownLatchTest { /*让主线程等待其他线程结束后在运行*/ public sta原创 2021-10-17 10:53:24 · 202 阅读 · 0 评论 -
线程集合类
线程安全集合类概述线程安全集合类可以分为三大类:遗留的线程安全集合如Hashtable(put,get都是用synchronized修饰,并发性不是很好), Vector使用Collections装饰的线程安全集合,如:Collections.synchronizedCollectionCollections.synchronizedListCollections. synchronizedMapCollections. synchronizedSetColle原创 2021-10-17 10:52:14 · 270 阅读 · 0 评论 -
线程安全单例
线程安全单例习题1、防止有子类,子类中不适当的方法破环了单例2、反序列化的时候也是要生成对象,和序列化生成的对象不是一个,相当于破坏了单例模式,怎么办?加一个方法返回对象,这样反序列化的时候返回的就是你方法中返回的对象3、如果设置成其他的别的类就可以无限的创建对象,就不是单例了。不能防止反射创建新的实例。4、没有线程安全,静态变量在类加载的时候初始化,由JVM保证线程安全5、用方法提供了更好的封装性1、枚举类里面定义几个对象将来就有几个,相当于枚举类的静态成员变量2、没有,静态成员变量在原创 2021-10-13 09:05:16 · 79 阅读 · 0 评论 -
不可变类和享元模式
共享模型之不可变类不可变的变量即使是共享的,也是线程安全的可变类都不是线程安全的例如:日期转换问题package demo1;import java.text.ParseException;import java.text.SimpleDateFormat;public class DateTest { public static void main(String[] args) throws Exception { SimpleDateFormat sdf=new原创 2021-10-11 17:43:03 · 93 阅读 · 0 评论 -
Unsafe
概述Unsafe对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用,只能通过反射获得原创 2021-10-11 15:25:38 · 101 阅读 · 0 评论 -
CAS(LongAdder)
不用锁来保护共享变量的线程安全,可以使用cas的原子类compareSet:比较并设置,内部是原子的为什么无锁效率高无锁情况下,即使重试失败,线程始终在高速运行,没有停歇,而synchronized会让线程在没有获得锁的时候,发生上下文切换,进入阻塞。打个比喻线程就好像高速跑道上的赛车,高速运行时,速度超快,- -旦发生上下文切换,就好比赛车要减速、熄火,等被唤醒又得重新打火、启动、加速… 恢复到高速运行,代价比较大●但无锁情况下,因为线程要保持运行,需要额外CPU的支持,CPU在这里就好比高速原创 2021-10-10 20:58:52 · 170 阅读 · 0 评论 -
double-checked locking问题和happens-before
double-checked locking问题以上的实现特点是:懒惰实例化首次使用getInstance(才使用synchronized加锁,后续使用时无需加锁有隐含的,但很关键的一-点:第一个if使用了INSTANCE变量,是在同步块之外在某个便俩个全部交给synchronized托管时,可以保证原子性,有序性和可见性。但是上述代码中INSTANCE变量在同步块外面还有,所以不能保证它的有序性,即在代码 ‘INSTANCE=new Singleton()’ 这条指令中可能会发生指令重排序原创 2021-10-09 16:28:02 · 100 阅读 · 0 评论 -
volatile
为什么会有指令重排呢?指令重排序优化在不改变程序结果的前提下,这些指令的各个阶段可以通过重排序和组合来实现指令级并行提示:分阶段,分工是提升效率的关键! I指令重排的前提是,重排指令不能影响结果volatile原理volatile的底层实现原理是内存屏障,Memory Barrier (Memory Fence)对volatile 变量的写指令后会加入写屏障对volatile变量的读指令前会加入读屏障如何保证可见性即写的时候将改动同步到主存,而读的时候读的是主存中的最新数据原创 2021-10-09 15:40:14 · 64 阅读 · 0 评论 -
两阶段终止模式--volatile(让一个线程优雅的终止)
两阶段终止模式–volatile代码:package demo1;public class StopXiancheng { public static void main(String[] args) throws InterruptedException { TwoPhaseTermination tpt=new TwoPhaseTermination(); tpt.start(); Thread.sleep(3500);原创 2021-10-09 14:39:51 · 114 阅读 · 0 评论 -
线程交替执行
线程交替执行打印abcabcabcabcabcwait-notifypackage demo1;public class JiaoTi1 { public static void main(String[] args) { WaitNofy wn=new WaitNofy(1,5); new Thread(()->{ wn.print("a",1,2); }).start(); new Threa原创 2021-10-09 11:54:29 · 211 阅读 · 0 评论 -
固定线程的执行顺序
固定线程的执行顺序(wait-notify)package demo1;public class ShunXu { static Object obj=new Object(); static boolean t2isRunned=false; public static void main(String[] args) { Thread t1=new Thread(()->{ synchronized (obj){ .原创 2021-10-09 11:27:31 · 98 阅读 · 0 评论 -
java实现死锁编写
死锁产生条件:多线程,多个锁,锁嵌套(拿到资源1后还想要别人已经获取的资源2)代码:package Thread;/** 死锁产生条件:多线程,多个锁,锁嵌套*/public class DeadLockDemo { public static void main(String[] args) { //两个不同的锁对象 Object obj1=new Object(); Object obj2=new Object(); n原创 2021-09-27 09:37:41 · 392 阅读 · 0 评论 -
【总结】锁
锁01 / synchronized1.1锁的粒度对于同步代码块,锁是synchonized括号里配置的对象;对于成员同步方法,锁是当前实例对象(this) ;对于静态同步方法,锁是当前类的Class对象。1.2实现机制synchronized用的锁是存在Java对象头里的。如果对象是数组类型,则虚拟机用3个字宽存储对象头,如果对象是非数组类型,则用2字宽存储对象头。其中,Mark Word里存储了锁的信息,包括锁的标志位与状态。对象头存的是对象的描述信息,对象体:对象的具体属性无锁原创 2021-09-21 20:49:10 · 196 阅读 · 0 评论 -
【总结】线程池
线程池01 / ThreadPoolExecutor1.1实现机制线程每次new都要和操作系统申请资源,且用完后就烧毁了,没有复用性处理任务四大步:1、当前已有的线程数有没有达到核心的线程数2、已经达到了核心线程数,将任务放到队列里面去3、当前并发太大,队列满了,再提交任务,判断最大线程数有没有达到,没有就创建核心线程之外的线程4、达到最大线程数后,满负荷时,拒绝任务拒绝有四个策略:1、谁提交的任务,谁自己去执行(主线程)2、直接抛异常3、放弃任务,不管了4、还要执行新执行的任务原创 2021-09-21 20:46:56 · 172 阅读 · 0 评论 -
原理之wait/notify
调用wait方法时,锁会释放开原理之wait/notifyOwner线程发现条件不满足,调用wait方法,即可进入WaitSet变为WAITING状态BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片BLOCKED线程会在Owner线程释放锁时唤醒WAITING线程会在Owner线程调用notify或notifyAll时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入EntryList重新竞争wait等待是原先获得了锁因条件不满足又释放了锁API介绍obj.wa..原创 2021-09-14 18:09:59 · 85 阅读 · 0 评论 -
同步模式之保护性暂停
同步模式之保护性暂停定义:即Guarded Suspension,用在一个线程等待另- 个线程的执行结果要点有一个结果需要从一个线程传递到另一 个线程,让他们关联同-个GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列 (见生产者消费者)JDK中,join的实现、Future的实现,采用的就是此模式因为要等待另-方的结果,因此归类到同步模式实现在两个线程之间交互结果设置超时的效果(省的一直等待另一个线程的结果):设置超时时间,记录开始的等待时间和原创 2021-09-14 18:08:58 · 116 阅读 · 0 评论 -
初始线程方法、状态
1、应用1.1应用之异步调用从方法调用的角度来讲,如果需要等待结果返回,才能继续运行就是同步不需要等待结果返回,就能继续运行就是异步注意:同步在多线程中还有另外一层意思,是让多个线程步调一致1)设计多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了5秒钟,如果没有线程调度机制,这5秒调用者什么都做不了,其代码都得暂停…2)结论比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程处理视频转换,避免阻塞主线程tomcat原创 2021-09-14 18:08:06 · 126 阅读 · 0 评论 -
Monitor、synchronized原理
1、Monitor概念java对象头以32位虚拟机为例Integer 8(头)+4(value)int 4Monitor(锁)Monitor被翻译为监视器或管程每个Java对象都可以关联一个Monitor对象,如果使用synchronized 给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针EntryList等待队列分析:刚开始Monitor中Owner为null当Thread-2执行synchronized(obj)就会将Moni原创 2021-09-14 18:06:15 · 320 阅读 · 0 评论 -
java并发原子类
原子类简介 Java从JDK 1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。在atomic包里一共提供了17个类(JDK8,支持32bit最高的版本,目前还会继续维持下去),属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新引用类型、原子更新属性、原子更新数组。 atomic包里的类基本都是使用Unsafe实现的包装类,而Unsafe类提供 了如下3个CAS方法。这三个方法都带原创 2021-09-14 18:04:57 · 222 阅读 · 0 评论 -
java并发编程基础
java并发编程基础n++不是原子的操作指令重排序,多线程并发时可能会出现问题例如:编译期出于性能的影响,指令重排,对于单线程没有问题因为还未初始化,就直接返回,会报错JMM3.1并发编程的关键目标并发编程需要处理两个关键问题,即线程之间如何通信和同步。通信:指线程之间以何种机制来交换信息;同步:指程序中用于控制不同线程之间的操作发生的相对顺序的机制。3.2并发编程的内存模型共有两种并发编程模型:共享内存模型、消息传递模型,Java采用的是前者。在共享内存模型下,线原创 2021-09-14 18:01:13 · 122 阅读 · 0 评论