JUC
文章平均质量分 84
喵先森爱吃鱼
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
7.9 ThreadLocal
问题描述:5个销售买房子,集团只关心销售总量的准确统计数,按照总销售额统计,方便集团公司给部分发送奖金,即 5 个线程同时操作一个共享变量销售总量,为了保证数据安全,只能加锁i < 5;j++) {}, "线程" + i).start();try {System.out.println(Thread.currentThread().getName() + "\t" + "共计卖出多少套" + house.saleCount);输出结果。原创 2024-07-13 17:39:21 · 645 阅读 · 0 评论 -
7.8 CompletableFuture
Future 对于结果的获取不是很友好,只能通过阻塞或轮询的方式得到任务的结果。CompletableFuture 实现了 Future 接口和 CompletionStage 接口。上述没有指定Executor的方法,直接使用默认的作为它的线程池执行异步代码。如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码。try {System.out.println("1号任务\t" + Thread.currentThread().getName());try {原创 2024-07-13 17:38:38 · 790 阅读 · 0 评论 -
7.7 CyclicBarrier
CyclicBarrier 循环栅栏,用来进行线程协作,等待线程满足某个计数。构造时设置【计数个数】。每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待,当等待的线程数满足【计数个数】时,继续执行。原创 2024-07-13 17:37:52 · 325 阅读 · 0 评论 -
7.6 CountdownLatch
用来进行线程同步协作,等待所有线程完成倒计时。其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一。输出可以配合线程池使用,改进如下输出。原创 2024-07-13 17:37:18 · 207 阅读 · 0 评论 -
7.5 Semaphore 原理
semaphore 信号量,用来限制能同时访问共享资源的线程的上限。输出。原创 2024-07-13 17:36:16 · 446 阅读 · 0 评论 -
7.4 读写锁原理
当读操作远远高于写操作时,这时候使用读写锁让读读可以并发,提高性能。类似于数据库中。提供一个数据容器类内部分别使用读锁保护数据的read(),写锁保护数据的write()方法。测试读锁-读锁可以并发输出结果,从这里可以看到 Thread-0 锁定期间,Thread-1 的读操作不受影响测试读锁-写锁相互阻塞输出结果也是相互阻塞的,这里就不测试了。原创 2024-07-13 17:08:35 · 972 阅读 · 0 评论 -
7.3 ReentrantLock原理
先从构造器开始看,默认为非公平锁实现NonfairSync 继承自 AQS没有竞争时:第一个竞争出现时Thread-1 执行了当前线程进入 acquireQueued 逻辑再次有多个线程经历上述过程竞争失败,变成这个样子Thread-0 释放锁,进入 tryRelease 流程,如果成功当前队列不为 null,而且 head 的 waitStatus = -1,进入 unparkSuccessor 流程。原创 2024-07-13 17:05:00 · 824 阅读 · 0 评论 -
7.2 AQS原理
*** 自定义锁(不可重入锁)*/// 锁实现的大部分功能由该同步器类来实现// 独占锁@Override// state = 0 表示未加锁,state = 1 表示加锁// 加锁成功,并设置 Owner 为当前线程@Override// state 是 volatile 变量,可以保证指令不会重排序,应当放在最后,保证其他语句对其他线程可见// 是否持有独占锁@Override// 加锁,不成功会进入等待队列@Override// 加锁,可打断。原创 2024-07-13 17:04:23 · 1035 阅读 · 0 评论 -
7.1 线程池
线程池自定义线程池自定义拒绝策略接口@FunctionalInterfacepublic interface RejectPolicy<T> { void reject(BlockingQueue<T> queue, T task);}自定义任务队列@Slf4j(topic = "c.BlockingQueue")public class BlockingQueue <T> { // 任务队列 private Deque原创 2024-07-13 16:56:25 · 942 阅读 · 0 评论 -
(六)共享模型之不可变
定义英文名称:Flyweight pattern。当需要重用数量有限的同一类对象时:::tips出自归类。原创 2024-07-13 16:55:29 · 607 阅读 · 0 评论 -
(五)共享模型之无锁
Unsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用,只能通过反射获得static {try {原创 2024-07-13 16:54:51 · 1201 阅读 · 0 评论 -
(四)共享模型之内存
Balking(犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。原创 2024-07-13 16:53:32 · 727 阅读 · 0 评论 -
(三)共享模型之管程
线程安全问题案例两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?@Slf4j(topic = "c.ThreadSafe")public class ThreadSafe { public static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(原创 2024-07-05 10:09:27 · 940 阅读 · 0 评论 -
(二)Java 线程
为什么需要 join?下面的代码执行,打印 r 是什么?test1();log . debug("开始");log . debug("开始");try {} log . debug("结束");r = 10;});log . debug("结果为:{}" , r);log . debug("结束");} }test1();log . debug("开始");log . debug("开始");try {} log . debug("结束");原创 2024-07-05 10:05:27 · 675 阅读 · 0 评论 -
(一)进程与线程
程序是有指令和代码组成的。进程是运行中的程序,进程可以视为程序的一个实例。一个进程之内可以分为一到多个线程。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行。单核 CPU 下,线程实际还是 串行执行的。并行:多个 CPU 同时执行多个任务,比如:多个人同时做不同的事。并发:一个 CPU(采用时间片)同时执行多个任务,比如:秒杀、多个人做同一件事。一般会将这种线程轮流使用 CPU 的做法称为并发。原创 2024-07-05 10:04:30 · 408 阅读 · 0 评论
分享