java多线程与并发
Atomatom98
但行好事 莫问前程
展开
-
Java多线程与并发知识点-----锁的“升级”是什么?
一.前置知识 java对象头 在JVM中,实例对象在内存中的布局分为三块区域:对象头、实例变量和填充数据。如下: 对象头:Hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)、Array length(数组长度,只有数组类型才有)。 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分...原创 2020-04-26 12:05:54 · 205 阅读 · 0 评论 -
深入理解Java多线程CAS比较并交换的底层原理
一.多线程环境下的自增操作 我们都知道在多线程情况下 i++ 的自增操作不是原子性的,因为它分为三个步骤: 取得i的值 将i的值+1 将新值写回内存 所以我们会使用JUC包下的AtomicInteger类来进行int的原子操作: public final int addAndGet(int delta) { return unsafe.getAndAddInt(this, va...原创 2019-11-05 10:14:32 · 388 阅读 · 0 评论 -
一个例子讲明白线程池ThreadPoolExecutor的七大参数-----面试必考
一.线程池的参数指的是什么 之前我们提到过线程池的实现类就是ThreadPoolExecutor,它是继承自AbstractExecutorService类的,实现了ExecutorService接口。 其实线程池的参数指的就是ThreadPoolExecutor的成员属性,这些属性决定了线程池本身。 二.七大参数 public ThreadPoolExecutor(int corePoolS...原创 2019-11-02 12:45:34 · 729 阅读 · 0 评论 -
Java并发编程之ThreadPool线程池基础部分-----什么是线程池,线程池架构,怎么使用
一.为什么要用线程池 线程池是一种多线程处理形式。 线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行 线程池的主要特点为: 线程复用;控制最大并发数;管理线程 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗 提高响应速度。当任务到达...原创 2019-10-29 21:24:06 · 189 阅读 · 0 评论 -
Java并发编程之BlockingQueue阻塞队列--------介绍,分类,源码分析
一.简介 以下摘自jdk1.8源码: A {@link java.util.Queue} that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in th...原创 2019-10-29 10:22:01 · 179 阅读 · 0 评论 -
Java并发编程之JUC辅助类Semaphore------信号量 一个例子看懂
一.场景引入 现在有6个车,要抢占三个车位,占用车位几秒后,离开车位 二.代码示例 public static void main(String[] args) { Semaphore semaphore = new Semaphore(3); for (int i = 1; i <= 6 ; i++) { new Threa...原创 2019-10-27 21:45:40 · 178 阅读 · 0 评论 -
Java并发编程之JUC辅助类CyclicBarrier------循环栅栏 一个例子看懂
一.场景引入 **只有收集到七颗龙珠,才能召唤神龙!**现在有七个线程负责寻找龙珠,我们需要在所有龙珠都找到的情况下,才打印出语句召唤神龙: 二.代码示例 public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {System.ou...原创 2019-10-27 20:59:30 · 221 阅读 · 0 评论 -
Java并发编程之JUC辅助类CountDownLatch------减小计数
一.场景引入 教师里有很多学生,比如说有7个,其中一个是班长,他负责在全员离开后关闭大门,现在要实现一个程序,其中包括main线程在内有七个线程,main是班长。 需求是:班长要在所有人都离开教室之后才关闭大门,也就是说main线程需要在所有线程运行完之后才打印这条语句 public static void main(String[] args) { for (int i = ...原创 2019-10-27 19:56:23 · 175 阅读 · 0 评论 -
Java多线程与并发之Callable接口-------是什么,怎么用
面试题:几种方式获得多线程? 此时如果你答两种:Runnable和继承Thread,这是不行的,正确答案应该是: 传统的是继承thread类和实现runnable接口 JDK1.5 以后又有通过实现callable接口和线程池获得 Callable和Runnable对比 我们都熟悉Runnable接口,只要继承了这个类,并重写其Run方法,就可以通过Thread的构造器传入Runnable实...原创 2019-10-27 17:50:26 · 386 阅读 · 0 评论 -
Java并发之CopyOnWriteArrayList源码------写时复制如何保证线程安全?
一.场景引入 还是继续上次的例子,三十个线程,每个都向list中加一个8位字符串并打印,观察结果 public class NotSafeDemo { public static void main(String[] args) { //List<String> list = new ArrayList<>(); List<Strin...原创 2019-10-27 08:38:15 · 428 阅读 · 0 评论 -
Java并发编程之集合类安全问题-------举例说明线程不安全 面试必备
一.场景引入 举例说明线程不安全 public class NotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); //List<String> list = Collections...原创 2019-10-25 10:38:09 · 408 阅读 · 0 评论 -
Java并发编程之线程8锁案例------多线程核心知识
0.场景引入 有一个资源类,一部手机,可以发邮件和短信,有两个线程想要对这个资源类进行操作 class Phone{ public synchronized void sendEmail() throws Exception{ //Java8新的工具类TimeUnit 跟Thread.sleep差不多 try { TimeUn...原创 2019-10-24 22:22:40 · 189 阅读 · 0 评论 -
Java并发编程之用Condition配合Lock进行多线程循环顺序打印-----面试常考
一.场景 多线程之间按顺序调度 三个线程 A B C A打印5次,B打印10次,C打印15次 循环十轮 如果用之前那一套语法,也就是wait,notifyAll很难实现我们的需求,所以我们通过Lock配合Condition来完成 二.思路 牢记口诀: 线程----->操作----->资源类 首先我们要写一个资源类,也就是这个题目的核心模块:控制多线程打印和唤醒哪个多线程的类 既...原创 2019-10-23 21:04:27 · 544 阅读 · 0 评论 -
Java并发编程之生产者与消费者-----synchronized实现+企业级模板
一.问题引入 两个线程,操作一个初始值为0的变量: 一个线程对变量加一 一个线程对变量减一 实现交替操作十轮 二.编程模板 在高内聚,低耦合的前提下,线程-------->操作--------->资源类 高内聚低耦合:在这个条件下,指的是对变量的改变(增加和减少等操作),都是在变量内部进行,比如这个问题中,要对变量加一减一,这两个方法都是在变量的内部进行,外部线程只是调用而已 ...原创 2019-10-23 08:43:33 · 132 阅读 · 0 评论 -
Java并发知识点笔记-----CAS 锁 阻塞队列 JUC
一.线程安全定义 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就是线程安全的。显然只有资源竞争时才会导致线程不安全,因此无状态对象永远是线程安全的。 二.原子操作 原子操作的描述是: 多个线程执行一个操作时,其中任何一个线程要么完全执行完此操作,要么没有执行此操作的任何步骤,那么...原创 2019-09-30 10:35:15 · 208 阅读 · 0 评论 -
Java 多线程 并发 学习笔记-----基础部分:线程进程区别 创建两种方式 什么是线程同步
一.并行与并发 并行性是指两个或多个事件在同一时刻发生。而并发性是指连个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机环境下(一个处理器),每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。例如,在1秒钟时间内,0-15ms程序A运行;15-30ms程序B运行;30-45ms程序C运行;45-60ms程序D运行,因...原创 2019-09-26 22:20:51 · 96 阅读 · 0 评论