Juc
并发
Tellme3
任务艰巨在于漫长。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
26、Stream流式计算,链式编程
什么是stream流式计算?大数据包括(存储+计算)集合,mysql这些是用来存储的,而计算是用stream流式的题目案例:只用一行代码,完成计算这些操作原创 2022-11-16 16:04:56 · 407 阅读 · 0 评论 -
25、四大函数式接口(消费型接口(Consumer)和供给型接口(Supplier))
第二步:供给型接口(Supplier):没有参数只有返回值(注意是看我们接口的方法没有参数)第一步:消费型接口(Consumer):只有输入参数,返回值(接口的方法是void和参数)原创 2022-11-16 16:00:00 · 887 阅读 · 0 评论 -
24、四大函数式接口(有函数型接口和断定型接口(都是函数式接口))
第一步:function(函数型接口(有一个输入,有一个输出)函数式接口都可以用lambda简化)。注意两个概念,我们这里函数式是函数式,函数型是函数型(型是我们自己想的)断定型接口(也是一个函数式接口)(Predicate):只有一个输入参数,返回值只能是一个布尔值(型是我们自己命名的,式是注解规范(函数式接口))函数式接口:只有一个抽象方法的接口(原创 2022-11-16 15:58:29 · 510 阅读 · 0 评论 -
23、线程池的最大核心线程数到底如何设置(cpu密集型,IO密集型)
方式3、我们最好不要写死里,运维要是跑服务器,服务器的核数肯定比我们多,所以我们用java的Api获取(Runtime.getRuntime().availableProcessors()),所以这里我们就代替下。思路1、CPU密集型:根据cpu的核数(是几核的就定义为几)可以保持CPU的效率最高!思路2、IO密集型:判断我们程序中十分耗IO的线程。(只要大于这个数就ok了)原创 2022-11-16 15:55:42 · 4794 阅读 · 0 评论 -
22、7大参数自定义线程池(核心线程数,最大核心线程数。。。拒绝策略(4种))
第二种拒绝策略:(CallerRunsPolicy(哪来的去哪里))这里我们是main线程创建的,所以就是main线程去处理。第一步:5个人进去(2个核心数处理,3个再阻塞队列里面,最大5个个核心线程数(3个在等待阻塞队列满了唤醒))第三个拒绝策略(DisCarPolict(队列满了,丢掉任务(不处理)不会抛出异常))第二步:进去6个人(就会使用2个核心线程和,一个最大线程数里的了,(3个再阻塞队列里))7大参数模型:(这里也说下线程池的运行逻辑)走this方法里(可以看到有7个参数)原创 2022-11-16 15:54:06 · 1488 阅读 · 0 评论 -
21、池化技术和线程池的使用(三大方法,7大参数,4种拒绝策略)
使用线程池后就要用线程池来创建线程(线程池的.execute()),线程池使用完后,程序结束,还必须要关闭线程池(.shutdown)(如何确保程序一定结束(放到finally咯))池化技术:事先准备好一些资源,有需要用就拿,用完再还回来。线程池的学习路线:(三大方法,7大参数,4种拒绝策略)线程复用,可以控制最大并发数,以及管理线程。原创 2022-11-16 15:50:12 · 430 阅读 · 0 评论 -
20、同步队列(SynchronousQueue)
同步队列(SynchronousQueue) 在阻塞队列里面有这个同步队列(synQueue),与阻塞队列不同(没有存储功能)同步队列:也就是没有容量(进去一个元素后,就必须等待取出来后才能再往里面放元素(最多只能放一个元素))操作:put/take 代码测试: 优化了下: 现象是t1放完1,然后等3秒取出t2线程取1后,线程t1才往里面放2原创 2022-11-16 15:47:47 · 409 阅读 · 0 评论 -
19、BlockingQueue(四组Api)
第二组:对于阻塞队列添加(offer)/移除(poll)超过容量的时候有返回值(存正常,异常都返回值true/flase,取值/null),不抛出异常。第一组:对于阻塞队列添加(add)/移除(remove)超过容量的时候抛出异常,有返回值(正常返回的true,只是异常没有返回值是抛出异常)添加阻塞是等待,还是超时等待啊。第四组:对于阻塞队列添加(offer)/移除(poll)超过容量的时候(超时等待(阻塞等待多少时间))第三组:对于阻塞队列添加(put)/移除(take)超过容量的时候(一直等待)原创 2022-11-16 15:46:28 · 201 阅读 · 0 评论 -
18、阻塞队列(BlockingQueue)
阻塞:(什么时候会阻塞)*往队列里写:队列中满了,我们还要向队列里面写数据,那么就会阻塞等待*从队列里取:队列中没有东西了,我们还要从队列中取数据。也会阻塞等待根据list/set来找熟悉我们blockingQueue。阻塞队列应用场景:多线程,线程池。1、blockingQueue(阻塞队列)的父类(Queue)和下面的实现类(ArrayBlockingQueue,LinkedBlockingQueue)2、Queue(父类(Collection(集合)),下面接口blockingQueue)(Deque原创 2022-11-16 15:44:06 · 322 阅读 · 0 评论 -
17、读写锁(ReadWriteLock(里面有读锁和写锁))
读写锁的特点:读的时候可以同时被多个线程读,写的时候只能有一个线程去写。第二步:我们使用读写锁(加锁)写锁又被称为(独占锁):一次只能被一个线程占有读锁又被称为(共享锁)多个线程可以同时占有原创 2022-11-15 09:44:26 · 571 阅读 · 0 评论 -
16、JUC常用的三大辅助类(Semaphore(信号量))
JUC常用的三大辅助类(Semaphore(信号量)) 场景:6个车抢3个车位(限流)假设123先进去。456等待,然后3走了4进来(124);2走了5进来(154);1走了6进来(654)轮流等待车位的。(在操作系统用到了很多(限流)) 两个重要的方法:我们这样理解逻辑;最开始信号量为3.我们进去获取进行-1。减到0那么也就是满了,其他需要等待里面的释放。然后我们释放就是将信号量从0加到3。然后就又获取了原创 2022-11-15 09:41:55 · 323 阅读 · 0 评论 -
15、JUC常用的三大辅助类(CyclicBarrier(计数器(加法计数器)))
JUC常用的三大辅助类(CyclicBarrier(计数器(加法计数器))) 若是我们设置的8,那么永远无法拿到就无法执行最后的召唤神龙原创 2022-11-15 09:40:42 · 215 阅读 · 0 评论 -
14、JUC常用的三大辅助类(CountDownLatch(计数器(减法计数器)))
JUC常用的三大辅助类(CountDownLatch(计数器(减法计数器))) 没有加countDownLarch.await()时 这里是先执行的关门再去执行数量-1(我们想要的效果是先-1最后到0再关门) 循环外有countDownLatch.await()。是等待计数器归零,再向下执行 里面的循环我们怎么是不管的。只要是这6个线程跑完了我们就向下执行原创 2022-11-15 09:39:38 · 153 阅读 · 0 评论 -
13、Callable介绍(Thread如何启动Callable)
3、而这个FutureTask可以与Callable挂上关系,也可以与Runnable挂上关系。2、Runnable下面有FutureTask实现类(里面有RunnableFuture)1、去看Runnable接口(里面有FutureTask实现类)我们Thread只能先new Runnable接口(这个接口里面有FutureTask实现类),所以里面写实现类和写Runnable是一样的(也就是第二行)。然后TutureTask(里面又有Callable)。所以联系起了Thread原创 2022-11-15 09:38:10 · 1481 阅读 · 0 评论 -
11、集合类不安全(set不安全解决(CopyOnWriteArraySet))以及HashSet的底层分析
方案1:还是工具类Collections.synchronizedSet(new HashSet)方案2、JUC下的一样的写入时复制(只是这里变为了CopyOnWriteArraySet())原创 2022-11-15 09:33:29 · 293 阅读 · 0 评论 -
10、集合类不安全(list不安全解决(CopyOnWriteArrayList))
方案2、通过工具类(也就是将这list变为安全的list)(也就是这个list顶部的Collection的工具类(Collection.synchronizedList))CopyOnWriteArrayList原理:写入时复制(COW是计算机程序设计的一种优化策略),其是用锁+数组拷贝+volatile保证线程安全的。方案1、用Vocter(底层是加syn锁的(jdk1.0就有了))原创 2022-11-15 09:31:50 · 413 阅读 · 0 评论 -
9、8锁现象彻底的理解锁(锁的只有两个东西,一个是对象,一个是Class模板(static修饰))
问题三:(我们在资源类中在给他一个没有锁的方法。问题7:(一个静态同步方法(static syn(休眠4s)),一个普通同步方法(syn),然后只有一个对象,两个线程使用)(先打电话,再等4s输出发短信)问题8:(一个静态同步方法(static syn(休眠4s)),一个普通同步方法(syn),然后两个实例对象)(还是先打电话,再等4s才是发短信)问题4:(我们准备两个对象,一个线程让对象1去调用发短信(还是睡眠4s的),一个线程让对象2去调用打电话)(这里是先打电话再等4s输出发短信了)原创 2022-11-15 09:28:30 · 363 阅读 · 0 评论 -
8、Condition精准唤醒线程(同步监视器)
锁只会锁两个东西,一个是对象,一个是Class模板(因为是通过这个模板new出对象的嘛)第二步:方法的加锁后的业务代码(判断,执行,通知)我们再外面加了个判断标志。第一步:创建资源类1、锁2、监视器3、方法代码(加锁,业务,释放锁)一个Condition这个同步监视器,一个监视器只能监视一个线程。后面的问题是:什么是锁,如何判断锁的是谁!第三步:main中调用。原创 2022-11-15 09:24:17 · 268 阅读 · 0 评论 -
7、Lock的生产者消费者问题
其中lock代替了syn,而condition代替了前面的wait这些Object方法,是一个监视器。Lock:(这就是我们juc下的)*Await*signal还有Condition来当监视器还是有个小问题,这里是没有到我们想要按我们想要的指定顺序去唤醒输出(这里演示的还是一个简单的消费者生产者问题)所以后面我们还要学习这个Condition这个监视器,(随机变精准唤醒线程)原创 2022-11-14 17:41:17 · 352 阅读 · 0 评论 -
6、传统的生产者,消费者问题和if判断产生的虚假唤醒线程问题
!!!虚假唤醒:拿两个加法线程A、B来说,比如A先执行,执行时调用了wait方法,那它会等待,此时会释放锁,那么线程B获得锁并且也会执行wait方法,两个加线程一起等待被唤醒。此时减线程中的某一个线程执行完毕并且唤醒了这俩加线程,那么这俩加线程不会一起执行,其中A获取了锁并且加1,执行完毕之后B再执行。如果是if的话,那么A修改完num后,B不会再去判断num的值,直接会给num+1。如果是while的话,A执行完之后,B还会去判断num的值,因此就不会执行。(我们使用while判断)原创 2022-11-14 17:38:31 · 552 阅读 · 0 评论 -
5、Synchronized和lock的区别
Synchronized和lock的区别syn是java内置的关键字,lock是一个java类(接口是特殊的类嘛)Syn是无法判断锁的状态的,Lock可以判断时候获取了锁Syn是自动的,会自动释放锁,lock必须要手动释放锁。如果不释放就会产生死锁了Syn线程1获取到syn锁后假如阻塞了(没有释放锁),那么线程2想要获取锁,那么就需要一直等待线程1释放syn锁了。而我们的Lock就不一定等待下去了,有一个lock.tryLock(尝试获取锁)拿不到就去执行下一个syn是一个可重入锁,不可中断原创 2022-11-14 17:36:32 · 679 阅读 · 0 评论 -
1、JUC(了解)
JUC(了解)1、JUC并发编程学习什么(java.util.concurrent(并发)) 其中有:java.util.concurrent/java.util.concurrent.atomic/java.util.concurrent.locks原创 2022-11-14 17:28:40 · 150 阅读 · 0 评论
分享