随笔分类 - 并发编程
java高并发场景,jvm的原理。满满的干货
摘要:package com.example.demo; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Reent
阅读全文
摘要:开门一张图 各个参数含义 int corePoolSize :线程池中核心线程数。 < corePoolSize ,就会创建新线程 。 > corePoolSize 这个任务就会保存到BlockingQueue。 注意:线程池最开始是没有线程的,当有任务的时候才new线程,然后保持corePoolS
阅读全文
摘要:主要api java.util.concurrent包下的新类。LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现。 LinkedBlockingQueue构造的时候若没有指定大小,则默认大小为Integer.MAX_VALUE,当然也可以在构造函数的参
阅读全文
摘要:实现Runnable接口 实现Callable接口,允许有返回值 继承Thread类创建线程 如何让线程停止? 怎么样才能让Java里的线程安全停止工作呢? 线程自然终止:自然执行完或抛出未处理异常, stop() (停止线程),resume() (继续执行线程), suspend() (挂起线程
阅读全文
摘要:CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后 > 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源 线程:CPU调度的最小单位,必须依赖进程而存在。 澄清并行和并发
阅读全文
摘要:参考博客:https://www.cnblogs.com/daoqidelv/p/6753162.html java cocurrent包提供了很多并发容器,在提供并发控制的前提下,通过优化,提升性能 为什么JUC需要提供并发容器? 1. java.util包中的大部分容器都是非线程安全的,若要在多
阅读全文
摘要:七个参数: corePoolSize:核心池的大小,在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中; maximumPool
阅读全文
摘要:但是volatile不适合做计数器使用,即使他具有可见性,但是它不具有原子性。不能保证数据的一致性。 但是volatile适合哪种场景呢? 比较适合做一些标示。比如说两个线程,线程B必须得等线程A执行完才能执行。看代码
阅读全文
摘要:synchronized 是什么时候释放?1.获取锁的线程执行完代码2.线程执行出现异常 synchronized 的缺陷?1.Lock类可以主动释放锁。2.synchronized 是被动。ReadWriteLock 读写锁 readLock 和 writeLockReentranLock 可重入
阅读全文
摘要:如果我们new了好几个线程,然后开始执行,肯定不是按照顺序执行的,因为多线程.start()方法开始执行之后,并不意味着立即执行,而是到就绪状态,等待cpu的调度,cpu如何调度,那我们就没法知道了,但是如何让线程按照指定的顺序来执行呢?我们可以利用线程的join方法。join()方法的主要作用是让
阅读全文
摘要:主内存和cpu之间的关系,因为cpu是在是处理速度太快了。所以一般cpu都有一个cpu缓存,上图的意思是主内存 》cpu缓存 》cpu寄存器 》cpu执行处理,写的时候反之。 看上图,就是多线程情况下java操作变量的大致步骤,需要注意的是,多线程操作的变量都是从主内存拿到的是变量的副本,然后进行一
阅读全文