
多线程
Rick1993
这个作者很懒,什么都没留下…
展开
-
java线程池大小设置
1,假设机器有N个CPU,那么对于CPU(计算)密集型的任务,应该设置线程数为N+1; 2,对于IO密集型的任务,应该设置线程数为2N; 参考:线程池大小设置原创 2022-05-20 01:33:07 · 789 阅读 · 0 评论 -
多线程之AQS
1,舒服舒服原创 2022-04-25 00:28:47 · 243 阅读 · 0 评论 -
synchronized与ReentrantLock
synchronized的同步原理:底层用到了Monitor锁 ReentrantLock原创 2019-11-17 11:35:24 · 180 阅读 · 0 评论 -
CompletionService获取线程运行结果
使用CompletionService来实现对任意一个线程运行完后的结果的及时获取。它内部添加了阻塞队列,从而获取feture中的值,然后根据返回值做对应的处理。 代码示例如下: package com.dalingjia.thead.future; import java.util.Random; import java.util.concurrent.*; /** * 先执行完的线程先处...原创 2019-11-13 21:48:57 · 270 阅读 · 0 评论 -
多线程的使用场景以及各个线程池的使用场景
1,多线程的使用场景 使用多线程来上传大量视频,充分利用多核CPU资源; 使用多线程来进行异步处理,由于业务逻辑时间较长,可以开启多线程去处理业务逻辑,主线程直接返回结果; 使用多线程来统计1000000以内求得的素数个数,可以开启3个线程,第一个线程从2开始,每次+3;第二个线程从3开始,每次+3;第三个线程从4开始,每次+3;同时利用一个原子类来统计总的个数。 final CountDown...原创 2019-11-13 21:16:27 · 1300 阅读 · 0 评论 -
什么是volatile关键字?
在讲解volatile关键字之前,我们有必要了解一下CPU,高速缓存和内存的关系,以及java的内存模型。 CPU,高速缓存和内存 CPU为了更快的执行代码,于是当从内存中读取数据时,并不是只读取自己想要的部分,而是读取足够的字节来填入高速缓存行,当CPU访问相邻的数据时,就不必每次都从内存中读取,而是从高速缓存中读取,提高了效率。因为访问内存要比访问高速缓存用的时间多得多。 Java内存...原创 2019-06-12 11:10:19 · 232 阅读 · 0 评论 -
什么是CAS机制?
先看下面一段代码: public class VolatileTest { private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { ...原创 2019-06-12 22:14:58 · 298 阅读 · 0 评论 -
CAS机制之ABA问题
这篇博客主要讲解两个问题: 1,Java当中CAS底层实现 2,CAS的ABA问题和解决办法 Java当中CAS底层实现 首先我们来看JDK1.7的AtomicInteger类的incrementAndGet源码: private volatile int value; public final int get() { return value; } public final in...原创 2019-06-13 11:03:38 · 2574 阅读 · 0 评论 -
并发编程
什么是上下文切换问题? 在单核心CPU架构中,对于多线程的运行是基于CPU时间片切换来实现的伪并行。由于时间片非常短导致用户以为是多个线程并行执行。而一次上下文切换,实际就是当前线程执行一个时间片之后切换到另外一个线程,并且保存当前线程执行的状态这个过程。上下文切换会影响到线程的执行速度,对于系统来说意味着会消耗大量的CPU时间。 减少上下文切换的方式: 无锁并发编程,在多线程竞争锁时,会导致大...原创 2019-10-14 11:35:38 · 122 阅读 · 0 评论 -
线程的基础知识(三)
Join线程 Thread提供了让一个线程等待另一个线程完成的方法:join()方法 代码演示: package com.dalingjia.thead; public class JoinThread extends Thread{ public JoinThread(String name) { super(name); } public void run(){ for (...原创 2019-07-11 01:55:55 · 140 阅读 · 0 评论 -
线程的基础知识(二)
线程的生命周期 当线程被创建并启动以后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,他要经过新建(new),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)5种状态。尤其是当线程启动以后,他不可能一直占有CPU独自云溪,所以CPU需要在多个线程之间切换,于是线程状态也会多次在运行,就绪之间切换。 新建状态和就绪状态: 当程序...原创 2019-07-11 00:32:19 · 132 阅读 · 0 评论 -
线程的基础知识(五)之线程通信
传统的线程通信 当线程在系统内运行时,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,单Java也提供了一些机制来保证线程协调运行。为了实现这一机制,可以借助Object类提供的wait(),notify()和notifyAll()三个方法: wait() :导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。调用wait...原创 2019-07-13 18:16:05 · 143 阅读 · 0 评论 -
线程的基础知识(四)
本博客整理来源于《疯狂java讲义》。 线程同步 因为run()方法的方法体不具有同步安全性,为了解决这个问题,Java的多线程引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块。格式如下: synchronized (obj) { ... //同步代码块 } 任何时刻只有一个线程可以获得对同步监视器的锁定,当同步代码块执行完毕后,该线程会释放对该同步监...原创 2019-07-13 14:11:04 · 92 阅读 · 0 评论 -
线程的基础知识(一)
线程概述: 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序;每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。也可以说每一个请求就是一个线程。 线程的创建和启动: ...原创 2019-07-08 18:42:24 · 147 阅读 · 0 评论 -
多线程之ThreadLocal类
ThreadLocal类 ThreadLocal,是Thread Local Variable(线程局部变量)的意思。线程局部变量(ThreadLocal)的功能其实非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量一样。使用ThreadLocal工具类可以很简洁地隔离多...原创 2019-07-08 16:25:48 · 603 阅读 · 0 评论 -
多线程之线程池
vs原创 2019-07-07 18:27:49 · 241 阅读 · 0 评论