
多线程
文章平均质量分 93
多线程
会很甜
渐行渐远渐无书,水阔鱼沉何处问
展开
-
ThreadLocal 详解
线程本地变量。当使用 ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程。每个线程都有一个 ThreadLocalMap ( ThreadLocal 内部类),Map中元素的键为 ThreadLocal,而值对应线程的变量副本。原创 2024-10-28 16:40:42 · 839 阅读 · 0 评论 -
CompletableFuture 异步编排
一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。问题:不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!不用阻塞队列也是可以的,不过实现起来比较麻烦而已,有好用的为啥不用呢。然后继续上一段的任务(里面包含了串行,AND,OR)原创 2023-10-04 00:44:25 · 1542 阅读 · 0 评论 -
多线程-阻塞队列
在这篇博客中我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。原创 2023-09-11 13:57:01 · 2721 阅读 · 0 评论 -
ThreadLocal
什么是ThreadLocal?顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。注意:ThreadLocal不是用来解决共享对象的多线程访问问题的。原创 2023-09-11 13:51:53 · 2695 阅读 · 0 评论 -
ThreadPoolExecutor
官方API解释线程池的好处:(1)通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。(2)对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。原创 2023-09-11 13:47:16 · 2645 阅读 · 0 评论 -
volatile关键字
一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证单线程程序最终执行结果和代码顺序执行的结果是一致的。什么意思呢?看下面例子a = 1;b = a;//写后读。a = 1;a = 2;//写后写。a = b;b = 1;//读后写。//以上语句不可重排,因为一旦重排会影响单线程最终执行结果a=1;b=2;//读后读,这个是可能重排的,因为这个执行先后顺序调换,不会影响执行结果。原创 2023-09-11 13:43:11 · 2681 阅读 · 0 评论 -
synchronized、Lock
如果我们创建的多个线程,存在着共享数据,那么就有可能出现线程的安全问题:当其中一个线程操作共享数据时,还未操作完成,另外的线程就参与进来,导致对共享数据的操作出现问题。关于synchronized一定要记住两点:(1)锁(既对象)一定是要唯一,否在锁无效。(2)对于同步代码块中的synchronized一定要放在共享变量上,否在也可能会达不到预期效果三、Lock简介Lock和synchronized 不同的是synchronized 会自动释放锁,而Lock必须手动释放,如果没有释放就可能造成死锁。原创 2023-09-11 13:40:22 · 2694 阅读 · 0 评论 -
线程生命周期、线程通讯
有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别。yield()让当前正在运行的线程回到就绪,以允许具有相同优先级的其他线程获得运行的机会。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。同时yield()不会放弃锁资源,所以有可能会出现死锁。1)第一个很重要的区别就是,wait方法必须正在同步环境下使用,比如synchronized方法或者同步代码块。原创 2023-09-11 13:31:15 · 2691 阅读 · 0 评论 -
创建线程的几种方式
注意:因为要通过Thread对象来开启线程,上面给出了Thread类的构造方法,没有直接的方法可以传入Callable,所以我们要对其进行加功。所以提供了一个FutureTask类,通过它可以获取返回的结果。且它间接实现了Runnable接口,所以可以传入Thread的构造函数。注意:开启线程要使用start()方法,run()方法只是普通的方法调用。实际上的创建线程还是通过本地方法,Java本身并不能开启线程。注意:这里要通过Thread对象来开启线程。方式四:通过线程池创建。原创 2023-03-06 20:49:00 · 270 阅读 · 0 评论