随笔分类 - 多线程、并发包和线程池
摘要:如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务; 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满
阅读全文
摘要:前面的我那几个源码截图,大家可以自己点进去看看,共同点都是封装了 ThreadPoolExcutor这构造函数 无非就是传递的参数不一样~~ 比如 SingleThreadExecutor 就是这个构造函数: 下面我就介绍些这个构造函数: 提交一个任务到线程池中,线程池的处理流程如下: 1、判断线程
阅读全文
摘要:线程池 什么是线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到
阅读全文
摘要:完全利用了阻塞队列的特性,实现了消费者生产者的关系,非常好玩! 大家赶紧看看代码,然后动手默写一个吧~~ 看到运行结果 消费者获取不到什么的话 等待等待 再获取不到就退出了
阅读全文
摘要:1、我建议大家 先理解并发队列再去理解线程池原理 并发队列,有两个大家务必要会的,并且以这俩为代表的队列都是继承自Queue。 ConcurrentLinkedQueue(非阻塞) BlockingQueue(阻塞) (说白了就是 等待 与 非等待) 阻塞式队列与非阻塞式队列的区别: 在于 入队 和
阅读全文
摘要:volitile和synchronize volitile可以保证可见性,不能保证原子性,禁止重排序 synchronize:既然可以保证可见性又能 保证原子性 重排序: cpu对代码实现优化,不会对有依赖关系的做重排序(多线程情况下) 多线程情况下是没有影响的 数据依赖性 如果两个操作访问同一个变
阅读全文
摘要:什么是Volatile 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。 在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加
阅读全文
摘要:多线程有三大特性 原子性、可见性、有序性 什么是原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必
阅读全文
摘要:ThreadLocal提高一个线程的局部变量,访问某个线程拥有自己局部变量。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal的接口方法 Thre
阅读全文
摘要:同步中嵌套同步,导致锁无法释放 t1先获取oj锁,然后this锁,才能把程序执行完毕 t2现货区this锁,再获取oj锁,才能把程序执行完毕 结果:
阅读全文
摘要:什么是静态同步函数? 方法上加上static关键字,使用synchronized 关键字修饰 或者使用类.class文件。 静态的同步函数使用的锁是 该函数所属字节码文件对象 可以用 getClass方法获取,也可以用当前 类名.class 表示。 总结: synchronized 修饰方法使用锁是
阅读全文
摘要:什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例: 现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码运行结果是有问题的 一号窗口和
阅读全文
摘要:共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存
阅读全文
摘要:现代操作系统基本采用时分的形式调度运行的线程,线程分配得到的时间片的多少决定了线程使用处理器资源的多少,也对应了线程优先级这个概念。在JAVA线程中,通过一个int priority来控制优先级,范围为1-10,其中10最高,默认值为5。下面是源码(基于1.8)中关于priority的一些量和方法。
阅读全文
摘要:当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1 废话不多说看代码: 如果先调用join的方法在执行 启动线程 结果分别: 和 其实质就是类似于一个加入线程 join(), 当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续 join(int), 可以等待指定的
阅读全文
摘要:多线程运行状态 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 新建状态 当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码 就绪状
阅读全文
摘要:直觉上来讲,守护线程和main相关 Java中有两种线程,一种是用户线程,另一种是守护线程。 用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止(另一条执行路径) 守护线程当进程不存在或主线程停止,守护线程也会被停止。 我们自己创建的线程叫 用户线程 如果主线程停止掉 不会影响用户线程(
阅读全文
摘要:线程与进程区别 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。 使用线程可以把占据
阅读全文