JUC并发编程
文章平均质量分 90
个人总结的JUC八股理解
栗子ing
一个正在努力的java 小白
展开
-
八、并发工具(下)
如果线程池中线程数为3,然后CyclicBarrier(2) 设置了2,那么如果下面的例子中task1跟task2循环执行3次,然后task1执行1秒,task2执行2秒,但是我们可以允许三个线程同时执行,然后就是task1 1秒 task2 2秒 task1 1秒,然后CyclicBarrier只能统计两个,所以我们统计的可能不是task1 跟 task2,可能是 task1 task1,因为执行时间不一样,所以可能导致结果有误差,所以建议设置成相同的,才能达到最佳效果。原创 2024-02-04 17:56:46 · 837 阅读 · 1 评论 -
七、并发工具(上)
在 QPS 量比较高的情况下,我们不可能说所有的访问都创建一个线程执行,这会导致内存占用过高,甚至有可能出现 out of memory另外也要考虑 cpu 核数,如果请求超过了cpu核数,那么有一部分线程就会收到限制,然后等cpu时间片结束会进行一个上下文切换,频繁的上下文也会影响性能。总和以上,我们可以引出线程池的概念,也就是结合前面的享元模式,创建一批线程,复用线程,既可以较少内存占用,又可以较少线程上下文切换。原创 2024-02-01 22:41:25 · 960 阅读 · 1 评论 -
六、不可变设计
23种设计模式之一保护性拷贝的创建的对象太多,浪费空间,所以需要考虑相同对象重用,这时候就用到享元模式。原创 2024-01-28 00:25:49 · 375 阅读 · 0 评论 -
五、无锁并发
为了实现多个线程对变量累加,如果一个线程就用base,多个线程就创建数组,每个线程对数组中自己独有的元素进行累加,最后把数组取和就行。原创 2024-01-26 19:41:17 · 891 阅读 · 1 评论 -
四、JMM
volatile 只能保证 有序性 和 可见性,但是不能保证原子性,不能解决指令交错。写屏障只能保证之后的读都是读取最新的结果,但是如果其他线程在当前线程写屏障写入主存的时候读取了旧值,这时候就不能保证了。有序性 只是保证了本线程内相关代码不被重排序,还是不能避免多个线程之间指令交错。原创 2024-01-24 22:02:16 · 834 阅读 · 1 评论 -
三、线程安全
wait()、notify()、 notifyAll() 方法都是属于Object 对象的方法,需要获取此对象的锁 之后才能够使用wait() 对象调用wait() 方法之后,线程会 Owner中释放锁,然后进入WaitSet中等待唤醒wait( time ) 对象调用带参数的wait()方法之后,线程会 Owner中释放锁,然后进入WaitSet中等待 指定时间,然后如果期间没有被唤醒,指定之间之后就会自动唤醒,然后进入EntryList再次尝试获取锁,竞争锁。原创 2024-01-21 18:50:31 · 1372 阅读 · 0 评论 -
二、Java线程
方法1 是把线程和任务合并在一起, 方法2 是把线程和任务分开了用Runnable 更容易与线程池等高级API 配合用 Runnable 让任务类脱离了Thread 继承体系,更灵活sleep 调用是进入等待阻塞状态, cpu时间片不会分配给阻塞状态的线程,需要等到他醒过来进入就绪状态。yield 调用是进入 就绪 状态, cpu 是会将时间片分配给就绪状态的线程, 也就是说如果没有其他线程,这时候yield 也就是没让出去。原创 2024-01-13 18:18:28 · 1071 阅读 · 1 评论 -
一、进程与线程
多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了5秒钟,如果没有线程调度机制,这5秒调用者什么都做不了,其代码都得暂停。注意:同步在多线程中还有另外一层意思,是让多个线程步调一致。从方法调用的角度来讲,如果。原创 2024-01-12 16:54:03 · 874 阅读 · 1 评论